AC日记——Maximal GCD codeforces 803c
思路:
最大的公约数是n的因数;
然后看范围k<=10^10;
单是答案都会超时;
但是,仔细读题会发现,n必须不小于k*(k+1)/2;
所以,当k不小于10^5时直接-1就好;
我们可以构造出gcd为1的序列为
1,2,3,4……n-k+1;
然后一个个枚举n的因子p;
1*p,2*p,3*p……(n-k+1)*p;
当枚举的p使得序列不满足于严格递增时,结束,输出合法答案;
来,上代码:
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define ll long long long long n,k; int main() { cin>>n>>k; if(k==1) { cout<<n; return 0; } if(n<k||k>200000||k==0) { cout<<-1; return 0; } long long c=k*(k+1)/2; if(n<c) { cout<<-1; return 0; } ll p=n/c,last=1; for(ll i=2;i<=sqrt(n)+1;i++) { if(n%i) continue; ll ok=1,sum=n; for(ll j=1;j<k;j++) { sum-=j*i; if(sum<=j*i) ok=false; } if(sum<=i*(k-1)) ok=false; if(ok) last=i; else break; } for(ll i=sqrt(n)+1;i>=1;i--) { if(n%i) continue; ll a=n/i; ll ok=1,sum=n; for(ll j=1;j<k;j++) { sum-=j*a; if(sum<=j*a) ok=false; } if(sum<=a*(k-1)) ok=false; if(ok) last=a; else break; } ll sum=n; for(ll i=1;i<k;i++) printf("%lld ",i*last),sum-=i*last; printf("%lld",sum); return 0; }