• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
DementRock
   首页          管理     

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 


 

posted @ 2010-02-15 18:36  DementRock  阅读(447)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3