算个欧拉函数给大家助助兴(米勒拉宾(判断素数)+Pollard_rho(求一个大数的因子 ))
这篇博客讲的很好:
https://www.cnblogs.com/ZERO-/p/9302169.html
题目描述
木南有一天学习了欧拉函数,知道了对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目。那么他定义f(n)为有多少个小于等于n的数可以整除n。
例如f(4)=3。(可以被1,2,4整除)。
那么你可以写个程序计算一下f(n)吗?
输入
输入一个n n≤1018n\le 10^{18}n≤1018
输出
输出f(n)
输出时每行末尾的多余空格,不影响答案正确性
样例输入复制
999999999999999989
样例输出复制
2
#include<iostream> //这应该是求一个数的因子个数。
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<cstdlib>
#include<set>
#include<map>
#include<ctime>
#include<stack>
#include<queue>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
const ll NUM=10;//运算次数,Miller_Rabin算法为概率运算,误判率为2^(-NUM);
ll t,f[100];
ll mul_mod(ll a,ll b,ll n)//求a*b%n,由于a和b太大,需要用进位乘法
{a=a%n;b=b%n;ll s=0;while(b){if(b&1)s=(s+a)%n;a=(a<<1)%n;b=b>>1;}return s;
}
ll pow_mod(ll a,ll b,ll n)//求a^b%n
{a=a%n;ll s=1;while(b){if(b&1)s=mul_mod(s,a,n);a=mul_mod(a,a,n);b=b>>1;}return s;
}
bool check(ll a,ll n,ll r,ll s)
{ll ans=pow_mod(a,r,n);ll p=ans;for(ll i=1;i<=s;i++){ans=mul_mod(ans,ans,n);if(ans==1&&p!=1&&p!=n-1)return true;p=ans;}if(ans!=1) return true;return false;
}
bool Miller_Rabin(ll n)//Miller_Rabin算法,判断n是否为素数
{if(n<2) return false;if(n==2) return true;if(!(n&1)) return false;ll r=n-1,s=0;while(!(r&1)){r=r>>1;s++;}for(ll i=0;i<NUM;i++){ll a=rand()%(n-1)+1;if(check(a,n,r,s))return false;}return true;
}
ll gcd(ll a,ll b)
{return b==0?a:gcd(b,a%b);
}
ll Pollard_rho(ll n,ll c)//Pollard_rho算法,找出n的因子
{ll i=1,j,k=2,d,p;ll x=rand()%n;ll y=x;while(true){i++;x=(mul_mod(x,x,n)+c)%n;if(y==x) return n;if(y>x) p=y-x;else p=x-y;d=gcd(p,n);if(d!=1&&d!=n) return d;if(i==k){y=x;k+=k;}}
}
void find(ll n)//找出n的所有因子
{if(Miller_Rabin(n)){f[t++]=n;//保存所有因子。 return;}ll p=n;while(p>=n)p=Pollard_rho(p,rand()%(n-1)+1);//由于p必定为合数,所以通过多次求解必定能求得答案find(p);find(n/p);
}
int main()
{srand(time(NULL));//随机数设定种子ll n;cin>>n;if(n==1){cout<<"1"<<endl;return 0;}t=0;find(n);sort(f,f+t);map<ll,int>q;for(int i=0;i<t;i++){q[f[i]]++;}map<ll,int>::iterator it;ll ans=1;for(it=q.begin();it!=q.end();it++){int s=it->second;ans*=1+s; //求因子个数的公式。 }cout<<ans<<endl; return 0;
}
算个欧拉函数给大家助助兴(米勒拉宾(判断素数)+Pollard_rho(求一个大数的因子 ))相关推荐
- 数论 —— 欧拉函数
[定义] 对正整数 n,欧拉函数是小于等于 n 的数中与 n 互质的数的个数,记作: 例如:,因为 1.3.5.7 均与 8 互质. [性质] 1)若 n 为一素数 p,则: 2)若 n 为一素数 p ...
- AcWing 874. 筛法求欧拉函数(线性筛法求欧拉函数模板)
给定一个正整数 n,求 1∼n 中每个数的欧拉函数之和. 输入格式 共一行,包含一个整数 n. 输出格式 共一行,包含一个整数,表示 1∼n 中每个数的欧拉函数之和. 数据范围 1≤n≤10^6 输入 ...
- CCPC-Wannafly Winter Camp Day3 (Div2, onsite) F 小清新数论 欧拉函数的利用 莫比乌斯反演 杜教筛
F - 小清新数论 做法一:欧拉函数 #include<stdio.h> #include<bits/stdc++.h> using namespace std; #defin ...
- 数论 - 分解质因数+欧拉函数 - Relatives POJ - 2407
数论 - 分解质因数+欧拉函数 文章目录 数论 - 分解质因数+欧拉函数 一.分解质因数 二.欧拉函数 三.模板: Relatives POJ - 2407 一.分解质因数 由 算 术 基 本 定 理 ...
- 突然想写一篇有关欧拉函数的博客
关于欧拉函数: 定义: φ(n)表示1~n中与n互质的数的个数: 求法: 已知n的标准分解式为: (哦对了,这里所有的因子都是质因子) 那么 然后求欧拉函数的两种方法: 1.按照定义暴力求解: in ...
- (hdu step 7.2.1)The Euler function(欧拉函数模板题——求phi[a]到phi[b]的和)
题目: The Euler function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 【bzoj2705】[SDOI2012]Longge的问题 欧拉函数
题目描述 Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N). 输入 一个整数,为N. 输出 ...
- poj2480(利用欧拉函数的积性求解)
题目链接: http://poj.org/problem?id=2480 题意:∑gcd(i, N) 1<=i <=N,就这个公式,给你一个n,让你求sum=gcd(1,n)+gcd(2 ...
- POJ 3090 Visible Lattice Points 【欧拉函数】
<题目链接> 题目大意: 给出范围为(0, 0)到(n, n)的整点,你站在(0,0)处,问能够看见几个点. 解题分析: 很明显,因为 N (1 ≤ N ≤ 1000) ,所以无论 N 为 ...
最新文章
- 百度短视频推荐系统的目标设计
- java nginx tomcat_Nginx + Tomcat (java )服务器部署
- java 获取光标_如何在java中使用Windows API获取当前鼠标光标类型?
- php怎么上传函数,PHP单文件上传原理及上传函数的封装操作示例
- 计算机组成原理中ID是什么,计算机组成原理.doc
- Confluent Platform 3.0支持使用Kafka Streams实现实时的数据处理(最新版已经是3.1了,支持kafka0.10了)...
- xml--Schema约束
- 程序媛如何自我突破?
- JavaScript tip
- mybatis日期范围查询_15. Django 2.1.7 模型 条件查询、模糊查询、空查询、比较查询、范围查询、日期查询...
- 英国汇丰银行拒绝为客户处理加密货币交易
- Python--day46--mysql触发器
- 常用数据库分页查询SQL汇总
- 计算机启动硬盘自检,怎样取消电脑开机磁盘自检
- Tableau:树状图
- oracle中累计求和_oracle累计求和
- Floating-Point overflow and underflow
- 大一Web课程设计 基于HTML家乡主题网页项目的设计与实现——中国牡丹之都山东菏泽(6页)
- 营销革命4.0 从传统到数字
- C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(上)
热门文章
- P2045 方格取数加强版
- 《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 4 章 答案
- ORMLite框架 的使用方法---给你的数据库操作插上翅膀
- python基础===使用switch方法,减少使用if语句
- 版本控制工具Git 常用操作命令
- jQuery图片提示和文字提示
- jsp中的内置对象(9个)、作用
- C# 实现ADSL自动断网和拨号(适用于拨号用户)
- POJ3041Asteroids(二分图最少顶点覆盖)
- 《中国管理安全服务(MSS)市场研究报告2010》读后感