zoukankan      html  css  js  c++  java
  • 题解 [CF803C] Maximal GCD

    题面

    解析

    一开始以为这题很难的...

    其实只要设(d)(a)的最大公因数,

    (a[i]=s[i]*d),

    因为(n=sum_{i=1}^{n}a[i]=sum_{i=1}^ns[i]*d=d*sum_{i=1}^ns[i]).

    所以(d)一定是(n)的约数,

    因此从大到小枚举(d),

    判断能否构造(k)(s[i])就行了.

    判断也很简单,

    只要(sum_{i=1}^ki=(k+1)*k/2<=n/d),

    然后将(s[i=1)~(k-1]=i),(s[k])等于剩下的就好了.

    (有点简陋但应该很好想吧...)

    最后注意(k)大约大于(200000)时就直接不可能了.

    要不然乘起来会爆(long long)旁边的lzf大仙T个不停.

    今天**地忘记排序结果懵逼地WA了

    code:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define int long long
    #define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
    using namespace std;
    
    inline int read(){
    	int sum=0,f=1;char ch=getchar();
    	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
    	return f*sum;
    }
    
    const int N=200000;
    int n,K;
    int sta[N],top=0;
    
    signed main(){
    	n=read();K=read();
    	if(K>=N){puts("-1");return 0;}
    	if((K*(K+1)/2)>n){puts("-1");return 0;}
    	for(int i=1;i*i<=n;i++){
    		if(n%i==0){
    			sta[++top]=i;
    			if(i*i!=n) sta[++top]=n/i;
    		}
    	}
    	sort(sta+1,sta+top+1);
    	for(int i=top;i>=1;i--){
    		int d=sta[i];
    		int s=n/d;
    		if((K*(K+1)/2)<=s){
    			for(int j=1;j<K;j++) printf("%lld ",j*d),s-=j;
    			printf("%lld
    ",s*d);
    			return 0;
    		}
    	}
    	puts("-1");
    	return 0;
    }
    
  • 相关阅读:
    Office365激活(无需密钥,无需下载软件)
    java垃圾回收及其优化
    Kafka副本机制
    sdn的相关学习系列之一mininet的安装
    javascript day 02
    关于javaScript
    html-day06
    盒子模型
    html-day04
    html--笔记day03
  • 原文地址:https://www.cnblogs.com/zsq259/p/11512294.html
Copyright © 2011-2022 走看看