考虑最后的 n 个数中包含 i 个 1,j 个 2 和 k 个 n−1。对 i 和 j 进行枚举。
推了半天式子,乱搞以后发现好像 j 和 j−1 必然有一个数是 i 的倍数。然后进行了一个 O(nlogn) 的枚举,结果 WA x 7。最后发现 WA 的点都没有找到解。是哪里写错了还是构造方法不对,或者是 j 和 j−1 必然有一个数是 i 的倍数 这个结论有问题?
#include<iostream>
using namespace std;
typedef long long ll;
ll n, p, q;
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> p >> q;
if(!p){
for(int i = 1; i <= n; ++i) cout << "10000000 ";
return 0;
}
for(ll i = 2; i <= n; ++i)
if(p == i * (i - 1) / 2){
for(ll j = 1; j <= i; ++j) cout << "1 ";
for(ll j = i + 1; j <= n; ++j) cout << q << ' ';
return 0;
}
for(ll i = 1; i <= n; ++i){
for(ll j = 0; i + j <= n; j += i){
ll up = 2 * p - (i + j) * (i + j) + i + j, down = 2 * i;
if(up % down) continue;
ll k = up / down;
if(k >= 0 && i + j + k <= n){
for(ll l = 1; l <= i; ++l) cout << 1 << ' ';
for(ll l = 1; l <= j; ++l) cout << 2 << ' ';
for(ll l = 1; l <= k; ++l) cout << q - 1 << ' ';
for(ll l = i + j + k + 1; l <= n; ++l) cout << q << ' ';
return 0;
}
}
for(ll j = 1; i + j <= n; j += i){
ll up = 2 * p - (i + j) * (i + j) + i + j, down = 2 * i;
if(up % down) continue;
ll k = up / down;
if(k >= 0 && i + j + k <= n){
for(ll l = 1; l <= i; ++l) cout << 1 << ' ';
for(ll l = 1; l <= j; ++l) cout << 2 << ' ';
for(ll l = 1; l <= k; ++l) cout << q - 1 << ' ';
for(ll l = i + j + k + 1; l <= n; ++l) cout << q << ' ';
return 0;
}
}
}
}