POJ 3696 极好的数论题目
2012-07-02 15:43
218 查看
View Code
#include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #include <bitset> #include <map> #include <vector> using namespace std; typedef long long llint; #define print(x) cout<<x<<endl #define input(x) cin>>x #define SIZE 45000 inline int mul(int x) { return x*x; } int prime[SIZE],hash[SIZE]; int ind,sz; int prime_factor[SIZE]; vector<llint> factor; void init() { ind=0; bitset<SIZE> p; for(int i=2;i<SIZE/2;i++) { if(p[i]) continue; else { for(int j=2;i*j<SIZE;j++) p[i*j]=1; } } for(int i=2;i<SIZE;i++) { if(!p[i]) prime[ind++]=i; } } llint gcd(llint a,llint b) { if(a<b) return gcd(b,a); else if(a%b==0) return b; else return gcd(b,a%b); } llint eular(llint y) { llint ans=1; for(int i=0;i<ind && mul(prime[i])<=y;i++) { if(y%prime[i]==0) { ans*=(prime[i]-1); y/=prime[i]; } while(y%prime[i]==0) { y/=prime[i]; ans*=prime[i]; } } if(y!=1) ans*=(y-1); return ans; } void dfs(llint iter,llint val=1) { if(iter==sz) factor.push_back(val); else { llint num=hash[iter]; llint t=prime_factor[iter]; llint t_val=val; for(int i=0;i<t;i++) { dfs(iter+1,t_val*num); t_val*=num; } dfs(iter+1,val); } } llint safemul(llint a,llint b,llint c) { llint ans=0; while(b) { if(b&1) ans+=a; if(b>=2) a=(a+a)%c; ans%=c; b>>=1; } return ans; } llint fastmod(llint a,llint b,llint c) { if(b==0) return 1; else if(b==1) return a%c; else { llint tmp=fastmod(a,b>>1,c)%c; tmp=safemul(tmp,tmp,c); if(b&1) return (tmp*a%c)%c; else return tmp%c; } } int slove(int x) { factor.clear(); memset(hash,0,sizeof(hash)); sz=0; memset(prime_factor,0,sizeof(prime_factor)); llint y=9LL*x/gcd(8,x); if(gcd(10,y)!=1) return 0; llint e=eular(y); //print(e<<' '<<y); for(int i=0;i<ind && prime[i]*prime[i]<=e;i++) { while(e%prime[i]==0) { prime_factor[sz]++; e/=prime[i]; } hash[sz]=prime[i]; sz++; } hash[sz]=e; prime_factor[sz++]++; dfs(0,1); sort(factor.begin(),factor.end()); for(int i=0;i<(int)factor.size();i++) { if(fastmod(10,factor[i],y)==1) return factor[i]; } return 0; } int main() { int x,cas=1; init(); while(scanf("%d",&x)!=EOF && x) { printf("Case %d: ",cas++); print(slove(x)); } return 0; }
相关文章推荐
- Poj-3696 The Luckiest number(数论)
- POJ 3696 神TM数论
- poj【数论/组合/博弈论】题目列表
- POJ The Luckiest number 3696 数论(处理快速幂过程中超int64的情况)
- POJ 3696 : The Luckiest number - 欧拉函数,快速幂[数论好题]
- poj 3696 The Luckiest number——数论 (快速幂取模,乘法取模模版)
- POJ【数论/组合/博弈论】题目列表
- POJ 3696 The Luckiest number(08合肥 数论)
- POJ【数论/组合/博弈论】题目列表
- POJ【数论/组合/博弈论】题目列表
- POJ【数论/组合/博弈论】题目列表
- POJ【数论/组合/博弈论】题目列表
- POJ 3696/ HDU 2462 The Luckiest number (数论)
- POJ 3696 神TM数论
- poj 3696 The Luckiest number (数论-快速幂+欧拉定理)
- POJ 3696 The Luckiest number(数论)
- POJ 动态规划题目列表
- poj 题目分类
- [省选前题目整理][POJ 2069]Super Star(爬山搜索)
- hdu poj 题目分类