POJ 3696 极好的数论题目

View Code
  1 #include <cstdio>

  2 #include <cstdlib>

  3 #include <cstring>

  4 #include <iostream>

  5 #include <algorithm>

  6 #include <bitset>

  7 #include <map>

  8 #include <vector>

  9 

 10 using namespace std;

 11 typedef long long llint;

 12 

 13 #define print(x) cout<<x<<endl

 14 #define input(x) cin>>x

 15 #define SIZE 45000

 16 

 17 inline int mul(int x)

 18 {

 19     return x*x;

 20 }

 21 

 22 int prime[SIZE],hash[SIZE];

 23 int ind,sz;

 24 int prime_factor[SIZE];

 25 vector<llint> factor;

 26 

 27 void init()

 28 {

 29     ind=0;

 30     bitset<SIZE> p;

 31     for(int i=2;i<SIZE/2;i++)

 32     {

 33         if(p[i]) continue;

 34         else

 35         {

 36             for(int j=2;i*j<SIZE;j++) p[i*j]=1;

 37         }

 38     }

 39 

 40     for(int i=2;i<SIZE;i++)

 41     {

 42         if(!p[i]) prime[ind++]=i;

 43     }

 44 }

 45 llint gcd(llint a,llint b)

 46 {

 47     if(a<b) return gcd(b,a);

 48     else if(a%b==0) return b;

 49     else return gcd(b,a%b);

 50 }

 51 

 52 llint eular(llint y)

 53 {

 54     llint ans=1;

 55     for(int i=0;i<ind && mul(prime[i])<=y;i++)

 56     {

 57         if(y%prime[i]==0)

 58         {

 59             ans*=(prime[i]-1);

 60             y/=prime[i];

 61         }

 62         while(y%prime[i]==0)

 63         {

 64             y/=prime[i];

 65             ans*=prime[i];

 66         }

 67     }

 68     if(y!=1) ans*=(y-1);

 69     return ans;

 70 }

 71 

 72 void dfs(llint iter,llint val=1)

 73 {

 74     if(iter==sz) factor.push_back(val);

 75     else

 76     {

 77         llint num=hash[iter];

 78         llint t=prime_factor[iter];

 79         llint t_val=val;

 80         for(int i=0;i<t;i++)

 81         {

 82             dfs(iter+1,t_val*num);

 83             t_val*=num;

 84         }

 85         dfs(iter+1,val);

 86     }

 87 }

 88 

 89 llint safemul(llint a,llint b,llint c)

 90 {

 91     llint ans=0;

 92     while(b)

 93     {

 94         if(b&1) ans+=a;

 95         if(b>=2) a=(a+a)%c;

 96         ans%=c;

 97         b>>=1;

 98     }

 99     return ans;

100 }

101 

102 llint fastmod(llint a,llint b,llint c)

103 {

104     if(b==0) return 1;

105     else if(b==1) return a%c;

106     else

107     {

108         llint tmp=fastmod(a,b>>1,c)%c;

109         tmp=safemul(tmp,tmp,c);

110         if(b&1) return (tmp*a%c)%c;

111         else return tmp%c;

112     }

113 }

114 

115 int slove(int x)

116 {

117     factor.clear();

118     memset(hash,0,sizeof(hash));

119     sz=0;

120     memset(prime_factor,0,sizeof(prime_factor));

121     llint y=9LL*x/gcd(8,x);

122     if(gcd(10,y)!=1) return 0;

123     llint e=eular(y);

124     //print(e<<' '<<y);

125     for(int i=0;i<ind && prime[i]*prime[i]<=e;i++)

126     {

127         while(e%prime[i]==0)

128         {

129             prime_factor[sz]++;

130             e/=prime[i];

131         }

132         hash[sz]=prime[i];

133         sz++;

134     }

135     hash[sz]=e;

136     prime_factor[sz++]++;

137     dfs(0,1);

138     sort(factor.begin(),factor.end());

139     for(int i=0;i<(int)factor.size();i++)

140     {

141         if(fastmod(10,factor[i],y)==1) return factor[i];

142     }

143     return 0;

144 }

145 

146 

147 int main()

148 {

149     int x,cas=1;

150     init();

151     while(scanf("%d",&x)!=EOF && x)

152     {

153         printf("Case %d: ",cas++);

154         print(slove(x));

155     }

156     return 0;

157 }

你可能感兴趣的:(poj)