Why so serious? --[NKU]schindlerlee

2010年1月28日星期四.sgu137

2010年1月28日星期四.sgu137

sgu137:数学推导,模的艺术
输入两个数n,m

对于一个序列
A[0...n-1] =  0.....1
B[0...n-1] =  1.....0

如果(B)能由(A)左转或者右转形成,那么也就是说,
存在一个元素k,对于每个元素A[i]都有,A[(i+k)%n] = B[i];
由B[0] == 1可以知道,一定有A[k] == 1;
又由于中间的省略号部分元素是相同的。
所以一定有B[k] == 1,继续推导,也一定有A[(k+k)%n] == 1,当最后推导到A[n-1] == 1时停止。

也就是最后要使 (m * k + 1) % n == 0
然后我们要做的也就是找到这个k即可。


 1 const int N = 1024;
 2 int n,m,off,a[N];
 3 int main()
 4 {
 5   int i,k;
 6   scanf("%d%d",&n,&m);
 7   off = m / n;
 8   m %= n;
 9   for (k = 0;(m * k + 1% n;k++);
10   for (i = k;m--;(i+= k) %= n) { a[i] = 1; }
11   for (i = 0;i < n;i++) {
12       printf("%d ",a[i] + off);
13   }
14   printf("\n");
15   return 0;
16 }
17 


posted on 2010-01-28 21:20 schindlerlee 阅读(1023) 评论(0)  编辑 收藏 引用 所属分类: 解题报告


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理