POJ3696 The Luckiest number 欧拉函数应用
2015-07-21 09:38
260 查看
题目链接:http://poj.org/problem?id=3696
题目大意:对于给定的整数L,找出L能整除最短的全8序列的长度,做为Bob的幸运数字。
分析:我们设幸运数字是x,由题意可知,长度为x全8序列为:8/9 * (10^x-1)=L * p,即(10^x-1)=9 * L * p/8。令m=9 * L/gcd(L,8),则存在p',使9 * L * p/8=m * p',方程转换为(10^x-1)=m * p',即求同余方程10^x≡1(mod m)的最小解。
根据欧拉公式我们知道,10^Φ(m)≡1(mod m),而我们要求的是最小的解,所以答案肯定是Φ(m)的因子,所以只需要枚举Φ(m)的因子,然后检查模值是否为1即可。
解题步骤如下:
(1)求解x=Φ(m);
(2)找出Φ(m)的所有素因子pi;
(3)令x=x/pi,直到10^x≠1(mod m)或pi不能整除x。如果10^x≠1(mod m),令x=x×pi;
(4)重复步骤(3),直到所有的素因子都经过(3)处理;
(5)此时x就是满足10^x≡1(mod m)的最小解。
对于何时无解呢?很显然,当gcd(10,m)!=1时,方程无解。因为10^x-1既不能被2整除,又不能被5整除。
实现代码如下:
题目大意:对于给定的整数L,找出L能整除最短的全8序列的长度,做为Bob的幸运数字。
分析:我们设幸运数字是x,由题意可知,长度为x全8序列为:8/9 * (10^x-1)=L * p,即(10^x-1)=9 * L * p/8。令m=9 * L/gcd(L,8),则存在p',使9 * L * p/8=m * p',方程转换为(10^x-1)=m * p',即求同余方程10^x≡1(mod m)的最小解。
根据欧拉公式我们知道,10^Φ(m)≡1(mod m),而我们要求的是最小的解,所以答案肯定是Φ(m)的因子,所以只需要枚举Φ(m)的因子,然后检查模值是否为1即可。
解题步骤如下:
(1)求解x=Φ(m);
(2)找出Φ(m)的所有素因子pi;
(3)令x=x/pi,直到10^x≠1(mod m)或pi不能整除x。如果10^x≠1(mod m),令x=x×pi;
(4)重复步骤(3),直到所有的素因子都经过(3)处理;
(5)此时x就是满足10^x≡1(mod m)的最小解。
对于何时无解呢?很显然,当gcd(10,m)!=1时,方程无解。因为10^x-1既不能被2整除,又不能被5整除。
实现代码如下:
#include <cstdio> #include <iostream> using namespace std; typedef long long ll; ll gcd(ll a,ll b) { return b?gcd(b,a%b):a; } ll mod; ll multi(ll a,ll b) { ll ans=0; while(b) { if(b&1) ans=(ans+a)%mod; a=(a+a)%mod; b>>=1; } return ans; } ll quick_mod(ll x) { ll ans=1,m=10; while(x) { if(x&1) ans=multi(ans,m); m=multi(m,m); x>>=1; } return ans; } int main() { int T=1; while(scanf("%lld",&mod)&&mod) { printf("Case %d: ",T++); mod=mod*9/gcd(mod,8); if(gcd(mod,10)!=1) { printf("0\n"); continue; } ll rea=mod,n=mod; ll p[50][2]; int k=0; for(ll i=2;i*i<=n;i++) if(n%i==0) { rea=rea-rea/i; do n/=i; while(n%i==0); } if(n>1) rea=rea-rea/n; n=rea; for(ll i=2;i*i<=n;i++) if(n%i==0) { p[k][0]=i; p[k][1]=0; do { n/=i; p[k][1]++; }while(n%i==0); k++; } if(n>1) { p[k][0]=n; p[k][1]=1; k++; } for(int i=0;i<k;i++) for(int j=1;j<=p[i][1];j++) if(quick_mod(rea/p[i][0])==1) rea/=p[i][0]; printf("%lld\n",rea); } return 0; }
相关文章推荐
- C#设计模式 - 观察者模式(使用委托)
- 收藏网站
- poj 3370 Halloween treats
- 静态数据竞争检测工具之LOCKSMITH-安装和使用
- 收藏网站56
- 《深入浅出struts2》--第三章,动作与结果
- POJ 1944:Fiber Communications
- 物联网的发展前途
- spring定时器配置
- Cocoa深入学习:NSOperationQueue、NSRunLoop和线程安全
- ZOJ3690Choosing number
- hive-0.11.0安装方法详解
- SQL Server Profiler工具
- AppCanCSS背景图片的属性
- SGU 280.Trade centers(贪心)
- POJ 1944:Fiber Communications
- Android通过反射打造可以存储任何对象的万能SharedPreferences
- 并没有那个艰难,但也并没有那么简单
- POJ1094 Sorting It All Out 拓扑排序(深搜)
- ImageView 长按保存