POJ
来源:互联网 发布:2013年总决赛韦德数据 编辑:程序博客网 时间:2024/06/05 20:11
题目:给你一个数L,找出它的一个倍数x,使得x*L的每一位都是8,输出最小x*L的位数,不存在则输出0
思路:8*(10^k-1)/9=x*L
令r=gcd(8,L),化简
8/r*(10^k-1)=x*(9*L)/r,
因为gcd(8/r,9*L/r)=1,
所以10^k-1=0%(9*L/r)
10^k=1%(9*L/r)
由欧拉函数可以得知有解的条件为gcd(10,9*L/r)=1,然后枚举9*L/r的欧拉函数值的因子,满足条件的最小的因子就是答案
代码:
#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<algorithm>#include<ctime>#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<vector>#include<map>#include<set>#include<queue>#include<stack>#include<list>#include<numeric>using namespace std;#define LL long long#define ULL unsigned long long#define INF 0x3f3f3f3f3f3f3f3f#define mm(a,b) memset(a,b,sizeof(a))#define PP puts("*********************");template<class T> T f_abs(T a){ return a > 0 ? a : -a; }template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}// 0x3f3f3f3f3f3f3f3fconst int maxn=2e5+50;bool isprime[maxn];int prime[maxn],tol;void make_prime(int n){ for(int i=0;i<=n;i++) isprime[i]=true; isprime[0]=isprime[1]=false; tol=0; for(int i=2;i<=n;i++){ if(isprime[i]) prime[tol++]=i; for(int j=0;j<tol;j++){ if(i*prime[j]<=n) isprime[i*prime[j]]=false; else break; if(i%prime[j]==0) break; } }}LL phi(LL n){ LL res=n; LL lim=n; for(int i=0;i<tol&&(LL)prime[i]*prime[i]<=lim;i++) if(n%prime[i]==0){ res=res-res/prime[i]; while(n%prime[i]==0){ n/=prime[i]; } } if(n>1) res=res-res/n; return res;}LL fac[maxn],num[maxn],cnt;void getfac(LL n){ LL lim=n; cnt=0; for(int i=0;i<tol&&(LL)prime[i]*prime[i]<=lim;i++){ if(n%prime[i]==0){ fac[cnt]=prime[i]; num[cnt]=0; while(n%prime[i]==0){ num[cnt]++; n/=prime[i]; } cnt++; } } if(n>1){ fac[cnt]=n; num[cnt++]=1; }}vector<LL> ans;void dfs(int i,LL x){ if(i==cnt){ ans.push_back(x); return; } for(int j=0;j<=num[i];j++){ dfs(i+1,x); x=x*fac[i]; }}LL mul_mod(LL a,LL b,LL MOD){ a%=MOD; b%=MOD; LL res=0; while(b){ if(b&1){ res+=a; if(res>=MOD) res-=MOD; } a=a*2; if(a>=MOD) a-=MOD; b=b/2; } return res;}LL pow_mod(LL a,LL b,LL MOD){ LL res=1; while(b){ if(b&1){ res=mul_mod(res,a,MOD); } a=mul_mod(a,a,MOD); b=b/2; } return res;}int main(){ int cas=0; LL L; make_prime(maxn-5); while(~scanf("%lld",&L)){ if(L==0) break; LL r=gcd((LL)8,L); LL MOD=(LL)9*L/r; if(gcd((LL)10,MOD)==1){ LL x=phi(MOD); getfac(x);// printf("MOD=%lld %lld\n",MOD,x);// for(int i=0;i<cnt;i++)// printf("%lld %lld\n",fac[i],num[i]); ans.clear(); dfs(0,1); sort(ans.begin(),ans.end());// for(int i=0;i<ans.size();i++){// printf("%lld ",ans[i]);// }// printf("\n");// printf("%lld\n",pow_mod((LL)10,(LL)1,MOD)); for(int i=0;i<ans.size();i++){ if(pow_mod((LL)10,ans[i],MOD)==1){ printf("Case %d: %lld\n",++cas,ans[i]); break; } } } else printf("Case %d: 0\n",++cas); } return 0;}
阅读全文
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- HQL语法之多表查询
- 分布式系统常见的事务处理机制
- Delay Constrained Maximum Capacity Path HDU
- 中文 柱状图
- 字节拷贝
- POJ
- Linux 批量删除文件目录 查找文件
- lintcode 链表求和
- Android Fragment学习与使用—基础篇
- Xcode快捷键
- 批量查询mysql数据库字段里的字符串
- Python OpenCV高清入门视频教程
- [Struts2]Struts2标签不显示properties文件值
- 怎样通过无线网络连接打印机?? 无线打印趣味玩法