BT数论题
求解10^x = 1 (mod 9*L/gcd(L,8))的满足x>0的最小解就是答案
由8构成的数A设有x位
那么A=8(10^0+10^1+...+10^(x-1));
很容易得到A=(8/9)*(10^x-1);
题目的要求就是A=0(mod L)
就是(8/9)*(10^x-1)=0(mod L);
->8*(10^x-1)=0(mod 9L);
->10^x-1=0(mod 9L/gcd(L,8));
->10^x =1 (mod 9L/gcd(L,8));
解法是先求phi(9L/gcd(L,8)),然后枚举其因子
比如:L=11;9L/gcd(L,8)=99;phi(9L/gcd(L,8))=10;解得10^2 =1 (mod 99),2是满足条件的最小的因子了
顺便给出1999999999的答案:
161290320
其间要求 素数选取 求欧拉函数 素因子分解 解模方程...涉及很多方面的综合题...
- #include <iostream>
- using namespace std;
- typedef unsigned long long llong;
- bool prime[45000]={true,true};
- llong l,fac[32][2],ans;
- double eul;
- int p[45000],top,len=0;
- llong pro(llong x,llong y,llong n)
- {
- llong ret=0,tmp=x%n;
- for(;y;y>>=1)
- {
- if(y&0x1)
- if((ret+=tmp)>n)ret-=n;
- if((tmp<<=1)>n)tmp-=n;
- }
- return ret;
- }
- llong pow_mod(llong a,llong b,llong c)
- {
- llong ret;
- for(ret=1;b;b>>=1)
- {if(b&1) ret=pro(ret,a,c);a=pro(a,a,c);}
- return ret;
- }
- llong gcd(llong a,llong b){return b?gcd(b,a%b):a;}
- void dfs(int dep,llong val)
- {
- int i;llong ret=1;
- if(dep==top)
- {
- if(pow_mod(10,val,l)==1&&val<ans)ans=val;
- return;
- }
- for(i=0;i<=fac[dep][0];i++)
- {
- dfs(dep+1,val*ret);
- ret*=fac[dep][1];
- }
- }
- int main()
- {
- llong n;
- int i,j,id=0;
- for(i=2;i<=213;i++)if(!prime[i])for(j=i;j*i<45000;j++)prime[i*j]=true;
- for(i=2;i<45000;i++)if(!prime[i])p[len++]=i;
- while(scanf("%lld",&n)!=EOF,n)
- {
- printf("Case %d: ",++id);
- ans=10000000000;
- top=0;
- l=9*n/gcd(n,8);
- eul=n=l;
- for(i=0;i<len;i++)
- {
- if(n%p[i]==0)
- {
- fac[top][0]=0;
- fac[top][1]=p[i];
- while(n%p[i]==0)
- {
- fac[top][0]++;
- n/=p[i];
- }
- top++;
- if(n==1||(n<45000&&!prime[n]))break;
- }
- }
- if(n!=1){fac[top][0]=1;fac[top][1]=n;top++;}
- for(i=0;i<top;i++)eul*=(1.0-1.0/(double)fac[i][1]);
- n=eul;
- top=0;
- for(i=0;i<len;i++)
- {
- if(n%p[i]==0)
- {
- fac[top][0]=0;
- fac[top][1]=p[i];
- while(n%p[i]==0)
- {
- fac[top][0]++;
- n/=p[i];
- }
- top++;
- if(n==1||(n<45000&&!prime[n]))break;
- }
- }
- if(n!=1){fac[top][0]=1;fac[top][1]=n;top++;}
- dfs(0,1);
- printf("%lld/n",ans==10000000000?0:ans);
- }
- }