2008年第33届ACM/ICPC亚洲区预赛(合肥)网络预选赛_1007 The Luckies number
来源:互联网 发布:大学从不逃课 知乎 编辑:程序博客网 时间:2024/04/30 03:31
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);
- }
- }
- 2008年第33届ACM/ICPC亚洲区预赛(合肥)网络预选赛_1007 The Luckies number
- 2008年第33届ACM/ICPC亚洲区预赛(哈尔滨)网络预选赛 1007__The Accomodation of Students 二分图最大匹配+染色
- 2010ACM-ICPC亚洲区预选赛
- HDU 4004 - The Frog\'s Games 第36届ACM/ICPC亚洲大连赛区网络赛
- 阶乘之和——第28届ACM/ICPC亚洲预赛
- 2010年ACM-ICPC亚洲区预选赛共设十五个赛区
- 2014 ACM-ICPC亚洲区域赛牡丹江站网络预选赛 CUntrusted Patrol
- 大连,第36届ACM国际大学生程序设计竞赛,亚洲区大连赛区预选赛
- 2010ACM-ICPC亚洲区预选赛中国大陆5个赛区比赛安排
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 The Heaviest Non-decreasing Subsequence Problem
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 The Heaviest Non-decreasing Subsequence Problem
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 The Heaviest Non-decreasing Subsequence Problem
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛:The Heaviest Non-decreasing Subsequence Problem
- ACM Hacker (USTC1042 合肥赛区网络预选赛热身赛 B题)
- [刷题]ACM ICPC 2015合肥网络赛
- ZOJ 3809 The Himalayas (2014 ACM/ICPC 牡丹江站 网络预选赛 A 题)
- ZOJ 3818 The Himalayas (2014 ACM/ICPC 牡丹江站 网络预选赛 J 题)
- 2014ACM-ICPC赛区鞍山网络预赛
- 要怎样实现用lisbox实现打开文件夹或程序
- winpcap资料4
- winpcap资料5
- winpcap资料6
- 指针与数组--发布日期:2006-8-28
- 2008年第33届ACM/ICPC亚洲区预赛(合肥)网络预选赛_1007 The Luckies number
- C中的字符数组-- 发布日期:2006-5-7 14:15:00
- WinSCP - 翻译 - 更新 - 4.1.7
- 学C++了--发布日期:2006-7-11
- JAVA中接口 Map.Entry的使用
- C++头文件--发布日期:2006-7-12
- glassfish 安装到应用 1
- 指针与数组--发布日期:2006-8-28
- 派生类的拷贝构造函数--发布日期:2006-12-25