Sgu 137
这是一道构造题。设一个满足对应的N和K的串为S(N,K)。首先要理解题意,一次“rotate” 指,对于S0S2.....SN-1,向左rotate则变换为S2S3..SN-1S0。很显然,如果S(N,K mod N)已经求得,只需每个数加上[K/N]即可。现在,还有(K mod N)个数上要再加1,显然SN-1是其中一个。
设经过若干次rotate之后,S(i+p) mod N=S'i mod N,则:
S p mod N = S' 0 mod N
S 2p mod N = S' p mod N
S 3p mod N = S' 2p mod N
……
S xp mod N = S' (x-1)p mod N
若将上式左边的数都加1,则必有x = K mod N,并设最后一项S xp mod N = SN-1,即(xp) mod N = N-1,即
Kp mod N = N-1,即 N-Kp==1(mod N),由数论知识,因(N,K)=1,故该方程必有解,枚举p就可以了。
时空复杂度均为O(N)。
sgu137
1 #include<stdio.h>
2 #include<stdlib.h>
3 int n,k,p,a[1000];
4 int main()
5 {
6 scanf("%d%d",&n,&k);
7 for(p=1;(k*p)%n!=n-1;++p);
8 for(int now=p;now!=n-1;now=(now+p)%n) a[now]=1;
9 a[n-1]=1,printf("%d",k/n);
10 for(int i=1;i<n;++i) printf(" %d",k/n+a[i]);
11 printf("\n");
12 return 0;
13 }
14
2 #include<stdlib.h>
3 int n,k,p,a[1000];
4 int main()
5 {
6 scanf("%d%d",&n,&k);
7 for(p=1;(k*p)%n!=n-1;++p);
8 for(int now=p;now!=n-1;now=(now+p)%n) a[now]=1;
9 a[n-1]=1,printf("%d",k/n);
10 for(int i=1;i<n;++i) printf(" %d",k/n+a[i]);
11 printf("\n");
12 return 0;
13 }
14