Codeforces803C Maximal GCD 思维

来源:互联网 发布:查看手机端口 编辑:程序博客网 时间:2024/06/08 17:35

题目链接

题意:

给你n,k(1<=n,k<=1e10)。

要你输出k个数,满足以下条件:

①这k个数之和等于n

②严格递增

②输出的 这k个数 的最大公约数q是同样满足①②条件中的最大的!

思路:

首先说一句....这一题如果不判断k的范围会爆long long..orz..

首先我们假设最大的gcd为x那么对于存在的那个数列有:

(t1+t2+t3+t4+....tk)*x=n; t1...tk为剩下的对应的a1....ak的因子.

化简得x=n/(t1+t2+...tk);

那么k的最大值就是当x==1 gcd最小的时候,我们大体来计算一下当gcd为1时 t1...tk为公差为1的等差数列,

那么就有k*(k+1)==2*n k约等于1e6即可,也就是当k大于1e6一定无解,剩下的那一小部分还可以通过下面判断,反正

不会爆longlong了。

根据上面的式子我们假设n可以整除(t1+t2+..tk)那么x的理论最大值就为n/(t1+t2+...tk);n最大为1e10 我们

可以通过枚举n的因子来确定一个最大的x,最后构造的时候只需要前k-1项t的值分别为1..k-1,最后剩余的全为最后一项

即可.

#include<bits/stdc++.h>#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rf(a) scanf("%lf", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pf(a) printf("%lf\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 1000000007#define inf 0x3f3f3f3f#define exp 0.00000001#define  pii  pair<int, int>#define  mp   make_pair#define  pb   push_backusing namespace std;typedef long long ll;const int maxn=1e5+10;ll n,k;ll w[maxn];int main(){Rl(n),Rl(k);if(k>1000000)Pi(-1);else{ll w=0;ll div=(k+1)*k/2,zz=sqrt(n);ll dd=n/div;for(ll i=1;i<=zz;i++){if(n%i==0){if(i<=dd)w=i;if(n/i<=dd){w=n/i;break;}}}//cout<<w;if(w==0)Pi(-1);else{ll ans=0;for(ll i=1;i<k;i++){   printf("%lld ",i*w);   ans+=i*w;}Pl(n-ans);}}return 0;}

0 0
原创粉丝点击