CF803C Maximal GCD
洛谷
CF
分析
考慮從 \(k\) 個數的 \(gcd\) 入手。
設他們的 \(gcd\) 為 \(d\) 。則有 \(d|n\) ,那么這 \(k\) 個數都除以 \(d\) 剩下的和即為 \(\frac{n}ze8trgl8bvbq\) ,又由于 \(k\) 個數嚴格上升,那么我們將 \(1\) 到 \(k\) 的和記為 \(sum\) ,有 \(sum=k*(k+1)/2\) 。于是必有 \(sum<=n/d\) ,所以我們可以枚舉 \(n\) 的因數,判斷是否滿足條件,再取最大值即可。
剩下的我們只需構造 \(k\) 個數,使其和等于 \(n/d\) ,最后輸出時將每個數再乘 \(d\) 。
貪心的想,我們直接將這組數構造成 \(1,2,3...k-1,k\) ,若 \(sum<n/d\) ,直接將這組數的最后一個數 \(k\) 更改為 \(k+n/d-sum\) 即可。
一些廢話:
這題真的毒瘤。。。。。。本來沒想多久就做出來的,結果一改就改了一個上午,總是在第21個點T,把數據蒯下來自己測也確實很慢,但卻不知道是為什么,\(O(\sqrt{n})\) 的算法也能這么慢......
下午看了題解,發現和我的方法一模一樣,只是代碼不同。我這該怎么改啊?
百思不得其解后,發現題解的 \(sum\) ,都是直接寫的 \(k*(k+1)/2\) 而不是定義一個變量代替這個式子,于是我用了#define sum (k*(k+1)>>1),,,,,,然后就AC了.......
代碼
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define re register
#define sum (k*(k+1)>>1)
using namespace std;
typedef long long ll;template <typename T> inline void read(T &x) {T f = 1; x = 0; char c;for (c = getchar(); !isdigit(c); c = getchar()) if (c == '-') f = -1;for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);x *= f;
}ll n, k, mx = 1;void print(ll d) {re ll c = n / d - sum;for (re ll i = 1; i <= k; ++i) {if (i == k) printf("%lld", (ll)(i + c) * d);else printf("%lld ", (ll)i * d);}
}int main() {read(n), read(k);if (k == 1) {printf("%lld", n); return 0;}if (k >= n) {puts("-1"); return 0;}if (k >= 1e8) {puts("-1"); return 0;}if (sum > n) {puts("-1"); return 0;}for (re ll i = 1; i * i <= n; ++i) {if (n % i != 0) continue;if (i >= sum) mx = max(mx, n / i);if (n / i >= sum) mx = max(mx, i);}print(mx);return 0;
}
轉載于:https://www.cnblogs.com/hlw1/p/11483499.html
總結
以上是生活随笔為你收集整理的CF803C Maximal GCD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 026_PPT知识汇总
- 下一篇: 前端之css基础学习(更正版)