妙用next數組打表求最小循環節len
阿新 • • 發佈:2018-08-29
ace main next() || pac i++ include 題意 out
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int len; int n = 1000; int next[10000]; int f[50000]; char s[50000]; int Pow(int a, int b) { int res=1; while(b) { if(b&1) res=res*a%7; a=a*a%7; b>>=1; } return res; } void getnext() { int j=0,k=-1; next[0]=-1; while(j<n) { if(k==-1||s[j]==s[k]) { next[++j]=++k; } else { k=next[k]; } } } int main() { for(int i=1;i<=600;i++) { f[i] = f[i-1] + Pow(i,i); f[i]%=7; } for(int i=0;i<=600;i++) { sprintf(&s[i],"%d",f[i]); } s[601]='\0'; cout<<s<<endl; getnext(); for(int i=1;i<=600;i++) //由題意可知,長度為1的字符串不算 { len=i-next[i]; //len代表最小循環節 if(i%len==0 && i/len>1) //周期大於1才是循環串 { cout<<"ans = "<<len<<endl; } } printf("\n"); }
妙用next數組打表求最小循環節len