Pollard_rho定理 大数的因数个数 这个板子超级快
https://nanti.jisuanke.com/t/A1413
AC代码
#include <cstdio>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
const int NUM=;//运算次数,Miller_Rabin算法为概率运算,误判率为2^(-NUM);
ll t,f[];
ll mul_mod(ll a,ll b,ll n)//求a*b%n,由于a和b太大,需要用进位乘法
{
a=a%n;
b=b%n;
ll s=;
while(b)
{
if(b&)
s=(s+a)%n;
a=(a<<)%n;
b=b>>;
}
return s;
}
ll pow_mod(ll a,ll b,ll n)//求a^b%n
{
a=a%n;
ll s=;
while(b)
{
if(b&)
s=mul_mod(s,a,n);
a=mul_mod(a,a,n);
b=b>>;
}
return s;
}
bool check(ll a,ll n,ll r,ll s)
{
ll ans,p,i;
ans=pow_mod(a,r,n);
p=ans;
for(i=;i<=s;i++)
{
ans=mul_mod(ans,ans,n);
if(ans==&&p!=&&p!=n-)return true;
p=ans;
}
if(ans!=)return true;
return false;
}
bool Miller_Rabin(ll n)//Miller_Rabin算法,判断n是否为素数
{
if(n<)return false;
if(n==)return true;
if(!(n&))return false;
ll i,r,s,a;
r=n-;s=;
while(!(r&)){r=r>>;s++;}
for(i=;i<NUM;i++)
{
a=rand()%(n-)+;
if(check(a,n,r,s))
return false;
}
return true;
}
ll gcd(ll a,ll b)
{
return b==?a:gcd(b,a%b);
}
ll Pollard_rho(ll n,ll c)//Pollard_rho算法,找出n的因子
{
ll i=,j,k=,x,y,d,p;
x=rand()%n;
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!=&&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-)+);//由于p必定为合数,所以通过多次求解必定能求得答案
_find(p);
_find(n/p);
}
int main()
{
srand(time(NULL));//随机数设定种子
ll n;
while(scanf("%lld",&n)==)
{
if(n == ) {
puts("");
continue;
}
if(Miller_Rabin(n)){
puts("");
continue;
}
t=;
_find(n);
map<ll,ll> ma;
for(int i=;i<t;i++)
ma[f[i]]++;
ll ans=;
for(auto it:ma)
ans*=it.second+;
printf("%lld\n",ans);
}
return ;
}
Pollard_rho定理 大数的因数个数 这个板子超级快的更多相关文章
- q次询问,每次给一个x,问1到x的因数个数的和。
q次询问,每次给一个x,问1到x的因数个数的和. #include<cmath> #include<cstdio> #include<cstring> usingn ...
- 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和
只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...
- 牛客练习赛25 A 因数个数和(数论分块)
题意: q次询问,每次给一个x,问1到x的因数个数的和. 1<=q<=10 ,1<= x<=10^9 1s 思路: 对1~n中的每个数i,i作为i,2i,3i,...的约数,一 ...
- HDU4704Sum 费马小定理+大数取模
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4704 题目大意: 看似复杂,其实就是求整数n的划分数,4=1+1+2和4=1+2+1是不同的.因而可 ...
- 如何求数字n的因数个数及因数和
我们有可能在某些数学题中会求到某个数的因数和,那我们怎么求呢? 因为我们知道任意一个合数都可以由两个或多个质数相乘得到,那么我们就先分解质因数吧 例:我们随便去一个数吧,嗯,就108了,好算... 我 ...
- hdu 4704 Sum【组合数学/费马小定理/大数取模】By cellur925
首先,我们珂以抽象出S函数的模型:把n拆成k个正整数,有多少种方案? 答案是C(n-1,k-1). 然后发现我们要求的是一段连续的函数值,仔细思考,并根据组合数的性质,我们珂以发现实际上答案就是在让求 ...
- 【牛客练习赛 25】A 因数个数和
题目地址:https://www.nowcoder.com/acm/contest/158/A 参考博客:https://blog.csdn.net/zzcblogs/article/details/ ...
- LightOJ-1138 Trailing Zeroes (III) 唯一分解定理 算n!的某个因数个数
题目链接:https://cn.vjudge.net/problem/ 题意 找一个最小的正整数n 使得n!有a个零 思路 就是有几个因数10呗 考虑到10==2*5,也就是说找n!因数5有几个 数据 ...
- 【数论】[因数个数]P4167樱花
题目描述 求不定方程 \(\frac {1}{x} + \frac{1}{y} = \frac{1}{n!}\)的正整数解的个数 \(n \leq 100^6\) Solution 化简得 \(x * ...
随机推荐
- Vue表单输入绑定
<h3>基础用法</h3> <p>你可以用<strong>v-model</strong>指令在表单input,textarea以及sele ...
- Thinkphp5 获取执行的sql语句
获取最后执行的sql语句 $str_order_action = db('order_action')->getLastSql(); //获取最后执行的sql语句 获取执行的sql语句 $ord ...
- Applied Nonparametric Statistics-lec2
Ref: https://onlinecourses.science.psu.edu/stat464/print/book/export/html/3 The Binomial Distributio ...
- Linux学习-检验软件正确性
md5sum / sha1sum / sha256sum 目前有多种机制可以计算文件的指纹码,我们选择使用较为广泛的 MD5, SHA1 或 SHA256 加密机 制来处理,我们拿NTP 软件来检查看 ...
- Linux学习-Linux 的开机流程分析
开机流程一览 系统开机的经过可以汇整成底下的流程的: 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置; 读取并执行第一个开机装置内 MBR 的 boot Loader (亦 ...
- JAVA中变量的类型及命名规范
1. 计算机是一种极度精确的机器;2. 要将信息存储在计算机当中,就必须指明信息存储的位置和所需的内存空间;3. 在JAVA编程语言当中,使用声明语句来完成上述的任务; 4. 变量的类型: 5. 变量 ...
- HDU 3486 Interviewe RMQ
题意: 将\(n\)个数分成\(m\)段相邻区间,每段区间的长度为\(\left \lfloor \frac{n}{m} \right \rfloor\),从每段区间选一个最大值,要让所有的最大值之和 ...
- CodeForces 519E 树形DP A and B and Lecture Rooms
给出一棵树,有若干次询问,每次询问距两个点u, v距离相等的点的个数. 情况还挺多的,少侠不妨去看官方题解.^_^ #include <iostream> #include <cst ...
- PYday16&17-设计模式\选课系统习题
1.设计模式:对程序做整体得规划设计,这样做是为了更好的实现功能,使代码的可扩展性更好有27种常见的设计模式.流行的设计模式参考书:GoF设计模式.大话设计模式设计模式是为了更好的实现模块间的解耦,便 ...
- Selenium WebDriver-操作单选框
先判断按钮是否已经被选中 如果没有被选中,才可以点击 #encoding=utf-8 import unittest import time import chardet from selenium ...