最小周期串:
如果s是ss的周期串,那么ss就可以表示成几个周期的s,
如果s是ss的最小周期串,那么s就是ss的周期串中最小的一个.
例,ZgxZgxZgxZgx的最小周期串是Zgx.
{很好理解}
给你一串数字ss,找出它的最小周期串n,求n!十进制表示的最末尾的非零数。ss的长度小于等于100。
1 /* 2 朴素版 3 */ 4 5 #include<iostream> 6 #include<string> 7 using namespace std; 8 9 string s; 10 int len=1,i; 11 int sum2=0; 12 int ans=1; 13 int a[8]={1,3,1,9,9,7,9,1}; 14 15 16 //g(n)=1*3*5*7*9....*(2*n-1) 17 int g(int n){ 18 if(n==1) return a[0]; 19 if(n==2) return a[1]; 20 sum2-=(n+2)/5; //2的指数减去5的指数 21 22 return (g((n+2)/5)*a[(n-(n+2)/5-1)%8])%10; 23 } 24 25 26 //f(n)=n! 27 int f(int n){ 28 if(n==1) return 1; 29 sum2+=n/2; //加上2的指数 30 31 return (f(n/2)*g(n-n/2))%10; 32 } 33 34 35 int main() 36 { 37 cin>>s; 38 for(len=1;len<=s.size();len++) 39 if(s.size()%len==0) 40 { 41 for(i=0;i<s.size();++i) 42 if(s[i%len]!=s[i]) break; 43 if(i>=s.size()) break; 44 } 45 46 47 int n=0; 48 for(i=0;i<len;++i) 49 n=n*10+s[i]-'0'; 50 51 ans=f(n); 52 while(sum2>0) 53 { 54 sum2--; 55 ans*=2; 56 ans%=10; 57 } 58 while(sum2<0) 59 { 60 sum2++; 61 ans*=5; 62 ans%=10; 63 } 64 65 66 cout<<ans<<endl; 67 68 69 70 // system("pause"); 71 72 }
1 /* 2 高精度版 3 */ 4 5 #include<iostream> 6 #include<string> 7 using namespace std; 8 9 string s; 10 int len=1,i; 11 int sum2[105]={0}; 12 int num[105]={0}; 13 int ans=1; 14 int a[8]={1,3,1,9,9,7,9,1}; 15 int b[4]={2,4,8,6}; 16 17 void print(int x[]){ 18 int i=100; 19 for(i=100;i>=0;i--) 20 if(x[i]!=0) break; 21 cout<<endl; 22 while(i>=0) cout<<x[i--]; 23 cout<<endl; 24 25 } 26 27 //return x==t 28 bool Equal(int x[],int t){ 29 for(int i=100;i>0;i--) 30 if(x[i]!=0) return false; 31 if(x[0]==t) return true; 32 return false; 33 } 34 35 //z=y+t 36 void add(int z[],int y[],int t){ 37 for(int i=0;i<=100;++i) 38 z[i]=y[i]; 39 z[0]+=t; 40 int i=0; 41 while(z[i]>=10) 42 { 43 z[i+1]+=z[i]/10; 44 z[i]%=10; 45 i++; 46 } 47 return ; 48 } 49 50 //x=x-y 51 void Sub(int x[],int y[]){ 52 for(int i=0;i<=100;++i) 53 { 54 x[i]=x[i]-y[i]; 55 if(x[i]<0) {x[i]+=10;x[i+1]-=1;} 56 } 57 return ; 58 } 59 60 //return (x-y-t)%m 61 int SubAndMod(int x[],int y[],int t,int m){ 62 Sub(x,y); 63 x[0]-=t; 64 int i=0; 65 while(x[i]<0) 66 { 67 x[i]+=10; 68 x[i+1]-=1; 69 i++; 70 } 71 72 int tt=0; 73 for(int i=100;i>=0;i--) 74 { 75 tt=tt*10; 76 tt=(tt+x[i])%m; 77 } 78 return tt; 79 } 80 81 //y=x/k 82 void Divide(int y[],int x[],int k){ 83 int t=0; 84 for(int i=100;i>=0;i--) 85 { 86 y[i]=(t+x[i])/k; 87 t=(t+x[i])%k; 88 t*=10; 89 } 90 } 91 92 //g(x)=1*3*5*7*9....*(2*x-1) 93 int g(int x[]){ 94 if(Equal(x,1)) return a[0]; 95 if(Equal(x,2)) return a[1]; 96 int y[105]={0},z[105]={0}; 97 add(y,x,2); //y=x+2 98 Divide(z,y,5); //z=y/5 z为5的指数 99 Sub(sum2,z); //2的指数减去5的指数 100 101 int t=SubAndMod(x,z,1,8); //t=(x-(x+2)/5-1)%8 102 return (g(z)*a[t])%10; 103 } 104 105 106 107 //y=y+x 108 void Sum(int y[],int x[]){ 109 for(int i=0;i<=100;++i) 110 { 111 y[i]=y[i]+x[i]; 112 y[i+1]+=y[i]/10; 113 y[i]%=10; 114 } 115 116 } 117 118 //f(x)=x! 119 int f(int x[]){ 120 if(Equal(x,1)) return 1; 121 int y[105]={0}; 122 Divide(y,x,2); //y=x/2 123 Sum(sum2,y); //加上2的指数 124 if(x[0]%2==0) return (f(y)*g(y))%10; 125 int z[105]={0}; 126 add(z,y,1); 127 return (f(y)*g(z))%10; 128 } 129 130 131 int main() 132 { 133 cin>>s; 134 for(len=1;len<=s.size();len++) 135 if(s.size()%len==0) 136 { 137 for(i=0;i<s.size();++i) 138 if(s[i%len]!=s[i]) break; 139 if(i>=s.size()) break; 140 } 141 142 for(i=0;i<len;++i) 143 num[i]=s[len-i-1]-'0'; 144 ans=f(num); 145 146 int z[105]={0}; 147 if(!Equal(sum2,0)) 148 ans=ans*b[SubAndMod(sum2,z,1,4)]; 149 150 ans%=10; 151 cout<<ans<<endl; 152 // system("pause"); 153 154 }