Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=150;
- struct Int{
- int n;
- int a[N];
- inline int& operator [](const int &x){
- return a[x];
- }
- inline const int & operator [](const int &x)const{
- return a[x];
- }
- inline Int(){
- n=0;
- memset(a,0,sizeof(a));
- }
- inline Int (int x){
- n=0;
- memset(a,0,sizeof(a));
- while(x){
- a[n++]=x%10;
- x/=10;
- }
- }
- };
- inline Int operator +(const Int &a,const Int &b){
- int n=max(a.n,b.n);
- Int ret;
- for(int i=0;i<n;++i){
- ret[i]=a[i]+b[i];
- }
- for(int i=0;i<n;++i){
- if(ret[i]>9)ret[i]-=10,ret[i+1]+=1;
- }
- while(ret[n]){
- if(ret[n]>9)ret[n]-=10,ret[n+1]+=1;
- n++;
- }
- ret.n=n;
- return ret;
- }
- inline Int operator -(const Int &a,const Int &b){
- int n=max(a.n,b.n);
- Int ret;
- for(int i=0;i<n;++i){
- ret[i]=a[i]-b[i];
- }
- for(int i=0;i<n;++i){
- if(ret[i]<0)ret[i]+=10,ret[i+1]-=1;
- }
- while(n&&!ret[n])n--;
- ret.n=n+1;
- return ret;
- }
- inline Int operator *(const Int &a,const Int &b){
- if(!a.n)return a;
- if(!b.n)return b;
- Int ret;
- int n=a.n+b.n-1;
- for(int i=0;i<a.n;++i){
- for(int j=0;j<b.n;++j){
- ret[i+j]+=a[i]*b[j];
- }
- }
- for(int i=0;i<n;++i){
- if(ret[i]>9)ret[i+1]+=ret[i]/10,ret[i]%=10;
- }
- while(ret[n]){
- if(ret[n]>9)ret[n+1]+=ret[n]/10,ret[n]%=10;
- n++;
- }
- ret.n=n;
- return ret;
- }
- inline Int mul2(const Int &a){
- return a+a;
- }
- inline Int div2(const Int &a){
- Int ret=a;
- int n=a.n;
- for(int i=n-1;~i;--i){
- if(ret[i]&1)ret[i-1]+=10;
- ret[i]>>=1;
- }
- while(n&&!ret[n-1])--n;
- ret.n=n;
- return ret;
- }
- inline bool cmp(const Int &a,const Int &b){
- if(a.n!=b.n)return a.n>b.n;
- int n=a.n-1;
- for(int i=n;~i;--i){
- if(a[i]!=b[i])return a[i]>b[i];
- }
- return 0;
- }
- inline void print(const Int &a){
- for(int i=a.n-1;~i;--i){
- putchar(a[i]+'0');
- }
- puts("");
- }
- inline Int gcd(const Int &a,const Int &b){
- if(a.n==0)return b;
- if(b.n==0)return a;
- if(!(a[0]&1)&&!(b[0]&1))return mul2(gcd(div2(a),div2(b)));
- if((a[0]&1)&&(b[0]&1))return cmp(a,b)?gcd(a-b,b):gcd(b-a,a);
- if(a[0]&1)return gcd(a,div2(b));
- if(b[0]&1)return gcd(div2(a),b);
- // assert(0);
- }
- int n,r,tot;
- Int ans,R;
- int val[N];
- int ID[N];
- char str[N];
- int main(){
- freopen("bijection.in","r",stdin);
- freopen("bijection.out","w",stdout);
- r(n),r(r);R=r;
- scanf("%s",str);
- for(int i=0;i<n;++i){
- if(!ID[str[i]-'a']){
- ID[str[i]-'a']=++tot;
- }
- }
- if(tot<r){
- for(int i=1;i<=tot;++i){
- Int ret;
- for(int j=0;j<n;++j){
- ret=ret*R+(ID[str[j]-'a']==i);
- }
- ans=gcd(ans,ret);
- }
- }
- else {
- for(int i=0;i<n;++i){
- ans=ans*R+ID[str[i]-'a']%r;
- }
- Int mx;
- for(int i=0;i<n;++i){
- mx=mx*R+(ID[str[i]-'a']==1);
- }
- for(int i=2;i<=tot;++i){
- Int ret;
- for(int j=0;j<n;++j){
- ret=ret*R+(ID[str[j]-'a']==i);
- }
- ans=gcd(ans,mx-ret);
- }
- }
- print(ans);
- return 0;
- }
- /*
- 100 10
- abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde
- */
Add Comment
Please, Sign In to add comment