题意:输入n,k.将n拆成k个数的序列,使得这k个数的gcd最大。(且序列严格递增)。1 ≤ n, k ≤ 1010 。
分析:假设k个数的gcd为d,则一定有d|n,(即d一定是n的因子);遍历n所有的因子到即可。不要忘记考虑d和
的情况。
代码:

/* Problem: C. Maximal GCD Time: 2017/5/4/19:29 */ #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <algorithm> #include <map> #include <vector> #define ll long long #define inf 100000000 #define N 1000000 using namespace std; int main() { ll n,k; scanf("%I64d%I64d",&n,&k); if(k>(ll)1e6){printf("-1 ");return 0;} ll ma=n*2/k/(k+1); if(ma==0){printf("-1 ");return 0;} ll ans=0; for(ll i=1;i<=sqrt(n);i++) { if(n%i==0) { if(i<=ma&&i>ans) ans=i; if((n/i)<=ma&&(n/i)>ans) ans=n/i; } } for(ll i=1;i<k;i++) printf("%I64d ",ans*i); printf("%I64d ",n-ans*k*(k-1)/2); return 0; }