HDU4344 Mark the Rope pollard_rho大整数分解应用
来源:互联网 发布:linux文件列表 编辑:程序博客网 时间:2024/06/06 19:16
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4344
题目大意:给出一个长为n(n小于2^63)的管子,现在Eric要在管子上做标记,每隔L个长度单位做一个标记,从管子头端开始,保证最后一次标记恰好在管子的尾端。让你找出有多少个这样的L(L<n),且他们之间两两互素,然后求出这些L的和最大值。
分析:分析一下就可以知道,这题其实就是让找正整数n有多少个素因子。我们用pollard_rho大整数分解可以分解n,然后对于n的每两个不同的因子,他们之间肯定互素,然后找出每个素因子的k次幂作为L的值,相加即是这些L值的和的最大值了。
实现代码如下(HDU上要用用G++交,C++交的话会TLE):
#include <cstdio>#include <iostream>#include <cstdlib>#include <cmath>#include <algorithm>#define times 10#define N 5501using namespace std;typedef long long LL;const LL INF=(LL)1<<61;LL key,ct,cnt,ans;LL fac[N],num[N];LL gcd(LL a,LL b){ return b?gcd(b,a%b):a;}LL multi(LL a,LL b,LL m){ LL ans=0; a%=m; while(b) { if(b&1) { ans=(ans+a)%m; b--; } b>>=1; a=(a+a)%m; } return ans;}LL quick_mod(LL a,LL b,LL m){ LL ans=1; a%=m; while(b) { if(b&1) { ans=multi(ans,a,m); b--; } b>>=1; a=multi(a,a,m); } return ans;}bool Miller_Rabin(LL n){ if(n==2) return true; if(n<2||!(n&1)) return false; LL m=n-1; int k=0; while(!(m&1)) { k++; m>>=1; } for(int i=0;i<times;i++) { LL a=rand()%(n-1)+1; LL x=quick_mod(a,m,n); LL y=0; for(int j=0;j<k;j++) { y=multi(x,x,n); if(y==1&&x!=1&&x!=n-1) return false; x=y; } if(y!=1) return false; } return true;}LL Pollard_rho(LL n,LL c){ LL i=1,k=2; LL x=rand()%(n-1)+1; LL y=x; while(true) { i++; x=(multi(x,x,n)+c)%n; LL d=gcd((y-x+n)%n,n); if(1<d&&d<n) return d; if(y==x) return n; if(i==k) { y=x; k<<=1; } }}void Find(LL n,LL c){ if(n==1) return ; if(Miller_Rabin(n)) { fac[ct++]=n; return ; } LL p=n; LL k=c; while(p>=n) p=Pollard_rho(p,c--); Find(p,k); Find(n/p,k);}void Solve(LL n){ ct=0; Find(n,120); sort(fac,fac+ct); num[0]=1; int k=1; for(int i=1;i<ct;i++) { if(fac[i]==fac[i-1]) num[k-1]++; else { num[k]=1; fac[k++]=fac[i]; } } cnt=k;}int main(){ int t; cin>>t; while(t--) { scanf("%lld",&key); Solve(key); ans=0; for(int i=cnt-1;i>=0;i--) { LL temp=1; for(int j=0;j<num[i];j++) temp*=fac[i]; ans+=temp; } if(cnt==1) ans/=fac[0];//由于L<N,所以当因子数为1时要除去一个因子 printf("%lld %lld\n",cnt,ans); } return 0;}
0 0
- HDU4344 Mark the Rope pollard_rho大整数分解应用
- HDU 4344 Mark the Rope Pollard_Rho大数分解
- hdu4344 Mark the Rope-------多校联合五
- 大数分解质因数:Mark the Rope
- hdu - 4344 - Mark the Rope - 大数分解
- 2012 Multi-University Training Contest 5-1006 hdu4344 Mark the Rope
- hdu-4344-Mark the Rope-大数分解质因子模板
- Pollard_rho算法模板(大整数的因子分解)
- Miller_Rabin大素数测试与Pollard_rho整数分解模版
- POJ2429 GCD & LCM Inverse pollard_rho大整数分解
- Miller_Rabin大素数测试 与 Pollard_rho整数分解模版
- hdu 4344 Mark the Rope
- hdu 4344 Mark the Rope
- HDU 4344 Mark the Rope
- hdu 4344 Mark the Rope (质因子分解+米勒拉宾素性)
- Pollard_rho算法(大整数的因子分解或判断是否为素数)
- Light OJ 1341 Aladdin and the Flying Carpet Pollard_rho整数分解+DFS
- HDOJ-4344 Mark the Rope(数论)
- 使用中国网建实现Java向手机发送短信的功能
- Android应用开发之(WebView中loadData与loadDataWithBaseURL的使用上的区别)
- Qt学习之一,键盘事件细节
- glActiveTexture
- OC中的数组
- HDU4344 Mark the Rope pollard_rho大整数分解应用
- JavaScript权威指南_131_第15章_脚本化文档_15.6-创建、 插入、删除节点-DocumentFragment
- hdu4405Aeroplane chess 概率dp水题
- HDU1005 Number Sequence
- web技术发展史
- S3C2410的触摸屏控制
- OC多态使用注意
- UVa 10189 SDNU 1127 Minesweeper 【7月20】
- HDU 5285:wyh2000 and pupil