SGU 137
2024.11.11 upd:修正了 \(\bmod\) 的 Latex
真的不能,不写了。
我们统一 \(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;
}
浙公网安备 33010602011771号