SGU 137

2024.11.11 upd:修正了 \(\bmod\) 的 Latex

真的不能,不写了。

SGU 137

我们统一 \(0\sim n-1\) 编号。

我们如果先给每一个数分 \([\frac{k}{n}]\),最后再分 \(k\bmod n\)\(1\) 也行。

我们发现 \(a_0+1\) 一定等于 \(a_{n-1}\),否则 \(a_{n-1}\) 的个数会减少。我们枚举循环了 \(x\) 位。则 \(a_0=a_x=a_{2x\bmod n}=\cdots\),直到 \(px=n-1\bmod n\) 就 stop,因为我们移位以后的 \(n-1\) 位要减 \(1\)

如果我们不遇到 \(px=n-1\bmod n\) 的情况,那就错了,因为会有 \(nx=0\bmod x\),变成 \(a_0+1=a_0\)。所以我们必须要弄出一个 \(px=n-1\bmod n\)

我们先考虑 \(p\) 是啥。我们发现,最后 \(a_0\) 一定是分 \(1\) 的,一共要分 \(k\bmod n\)\(1\)。为了方便,我们就把 \(k\)\(n\) 吧。这样,如果 \(0\neq x\neq 2x\bmod n\cdots\),我们要满足 \(p=k\)。好,那么我们要求 \(kx=n-1\bmod n\)\(x\)。然后直接填就可以了。

为啥是对的?其实就是要证明前 \(k\) 个一定是相等的。这个就用到 \(\gcd(k,n)=1\) 了。(模完也是如此)如果 \(ki=kj\bmod n\),由于 \(\gcd(k,n)=1\),则 \(i=j\mod n\),而 \(i,j\) 的差 \(\le n-1\),所以不可能。这个也证明了一定能找到 \(x\),因为对于 \(i=0\sim n-1\)\(ik\bmod n\) 都不相等。

upd:证明还有一个更简单的。\(xk=n-1\bmod n\) 要存在,也就是 \(xk-yn=-1\bmod n\)。因为 \(\gcd(k,n)=1\),所以根据裴蜀定理,有解。

然后就做完了!代码很短。

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int N = 1e3+3;

int n,k,p,t,a[N];

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin>>n>>k;
	t=k/n,k=k%n;
	for (p=1; p<n; p++){
		if (p*k%n==n-1){
			break;
		}
	}
	for (int i=p; i!=n-1; i=(i+p)%n){
		a[i]=1;
	}
	a[n-1]=1;
	for (int i=0; i<n-1; i++){
		cout<<a[i]+t<<" ";
	}
	cout<<a[n-1]+t<<"\n";
	return 0;
}
posted @ 2024-07-09 21:07  SFlyer  阅读(62)  评论(0)    收藏  举报