yicongli

T151T1

Mar 14th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=150;
  17.  
  18. struct Int{
  19.     int n;
  20.     int a[N];
  21.    
  22.     inline int& operator [](const int &x){
  23.         return a[x];
  24.     }
  25.    
  26.     inline const int & operator [](const int &x)const{
  27.         return a[x];
  28.     }
  29.    
  30.     inline Int(){
  31.         n=0;
  32.         memset(a,0,sizeof(a));
  33.     }
  34.    
  35.     inline Int (int x){
  36.         n=0;
  37.         memset(a,0,sizeof(a));
  38.         while(x){
  39.             a[n++]=x%10;
  40.             x/=10;
  41.         }
  42.     }
  43.    
  44. };
  45.  
  46. inline Int operator +(const Int &a,const Int &b){
  47.     int n=max(a.n,b.n);
  48.     Int ret;
  49.     for(int i=0;i<n;++i){
  50.         ret[i]=a[i]+b[i];
  51.     }
  52.     for(int i=0;i<n;++i){
  53.         if(ret[i]>9)ret[i]-=10,ret[i+1]+=1;
  54.     }
  55.     while(ret[n]){
  56.         if(ret[n]>9)ret[n]-=10,ret[n+1]+=1;
  57.         n++;
  58.     }
  59.     ret.n=n;
  60.     return ret;
  61. }
  62.  
  63. inline Int operator -(const Int &a,const Int &b){
  64.     int n=max(a.n,b.n);
  65.     Int ret;
  66.     for(int i=0;i<n;++i){
  67.         ret[i]=a[i]-b[i];
  68.     }
  69.     for(int i=0;i<n;++i){
  70.         if(ret[i]<0)ret[i]+=10,ret[i+1]-=1;
  71.     }
  72.     while(n&&!ret[n])n--;
  73.     ret.n=n+1;
  74.     return ret;
  75. }
  76.  
  77. inline Int operator *(const Int &a,const Int &b){
  78.     if(!a.n)return a;
  79.     if(!b.n)return b;
  80.     Int ret;
  81.     int n=a.n+b.n-1;
  82.     for(int i=0;i<a.n;++i){
  83.         for(int j=0;j<b.n;++j){
  84.             ret[i+j]+=a[i]*b[j];
  85.         }
  86.     }
  87.     for(int i=0;i<n;++i){
  88.         if(ret[i]>9)ret[i+1]+=ret[i]/10,ret[i]%=10;
  89.     }
  90.     while(ret[n]){
  91.         if(ret[n]>9)ret[n+1]+=ret[n]/10,ret[n]%=10;
  92.         n++;
  93.     }
  94.     ret.n=n;
  95.     return ret;
  96. }
  97.  
  98. inline Int mul2(const Int &a){
  99.     return a+a;
  100. }
  101.  
  102. inline Int div2(const Int &a){
  103.     Int ret=a;
  104.     int n=a.n;
  105.     for(int i=n-1;~i;--i){
  106.         if(ret[i]&1)ret[i-1]+=10;
  107.         ret[i]>>=1;
  108.     }
  109.     while(n&&!ret[n-1])--n;
  110.     ret.n=n;
  111.     return ret;
  112. }
  113.  
  114. inline bool cmp(const Int &a,const Int &b){
  115.     if(a.n!=b.n)return a.n>b.n;
  116.     int n=a.n-1;
  117.     for(int i=n;~i;--i){
  118.         if(a[i]!=b[i])return a[i]>b[i];
  119.     }
  120.     return 0;
  121. }
  122.  
  123. inline void print(const Int &a){
  124.     for(int i=a.n-1;~i;--i){
  125.         putchar(a[i]+'0');
  126.     }
  127.     puts("");
  128. }
  129.  
  130. inline Int gcd(const Int &a,const Int &b){
  131.     if(a.n==0)return b;
  132.     if(b.n==0)return a;
  133.     if(!(a[0]&1)&&!(b[0]&1))return mul2(gcd(div2(a),div2(b)));
  134.     if((a[0]&1)&&(b[0]&1))return cmp(a,b)?gcd(a-b,b):gcd(b-a,a);
  135.     if(a[0]&1)return gcd(a,div2(b));
  136.     if(b[0]&1)return gcd(div2(a),b);
  137. //  assert(0);
  138. }
  139.  
  140. int n,r,tot;
  141. Int ans,R;
  142.  
  143. int val[N];
  144. int ID[N];
  145. char str[N];
  146.  
  147.  
  148. int main(){
  149.     freopen("bijection.in","r",stdin);
  150.     freopen("bijection.out","w",stdout);
  151.     r(n),r(r);R=r;
  152.     scanf("%s",str);
  153.     for(int i=0;i<n;++i){
  154.         if(!ID[str[i]-'a']){
  155.             ID[str[i]-'a']=++tot;
  156.         }
  157.     }
  158.     if(tot<r){
  159.         for(int i=1;i<=tot;++i){
  160.             Int ret;
  161.             for(int j=0;j<n;++j){
  162.                 ret=ret*R+(ID[str[j]-'a']==i);
  163.             }
  164.             ans=gcd(ans,ret);
  165.         }
  166.     }
  167.     else {
  168.         for(int i=0;i<n;++i){
  169.             ans=ans*R+ID[str[i]-'a']%r;
  170.         }
  171.         Int mx;
  172.         for(int i=0;i<n;++i){
  173.             mx=mx*R+(ID[str[i]-'a']==1);
  174.         }
  175.         for(int i=2;i<=tot;++i){
  176.             Int ret;
  177.             for(int j=0;j<n;++j){
  178.                 ret=ret*R+(ID[str[j]-'a']==i);
  179.             }
  180.             ans=gcd(ans,mx-ret);
  181.         }
  182.     }
  183.     print(ans);
  184.     return 0;
  185. }
  186. /*
  187. 100 10
  188. abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde
  189. */
Add Comment
Please, Sign In to add comment