ALFR Round2 A 求调
  • 板块学术版
  • 楼主No_Rest
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/15 12:35
  • 上次更新2024/6/15 15:51:07
查看原帖
ALFR Round2 A 求调
550821
No_Rest楼主2024/6/15 12:35

考虑最后的 nn 个数中包含 ii 个 11,jj 个 22 和 kk 个 n−1n-1。对 ii 和 jj 进行枚举。

推了半天式子,乱搞以后发现好像 jj 和 j−1j-1 必然有一个数是 ii 的倍数。然后进行了一个 O(nlog⁡n)\mathcal O(n \log n) 的枚举,结果 WA x 7。最后发现 WA 的点都没有找到解。是哪里写错了还是构造方法不对,或者是 jj 和 j−1j-1 必然有一个数是 ii 的倍数 这个结论有问题?

#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;
			}
		}
	} 
} 
2024/6/15 12:35
加载中...