题目链接

戳我

\(Solution\)

令\(gcd\)为\(x\),那么我们将整个序列\(/x\),则序列的和就变成了\(\frac{n}{x}\),所以\(x\)必定为\(n\)的约数所以现在就是要构造出一个序列长度为\(k\),和为\(\frac{n}{x}\)。我们令前\(k-1\)个为\(1,2....k-1\)最后一个再用\(\frac{n}{x}-\)这\(k-1\)个的和就是最后一个数了。最后的答案就是构造出来的序列\(*x\)

所以我们现在就是要来判断\(x\)可不可行,很明显如果\((1+k)*k/2>\frac{n}{x}\)的话显然不可行,反之则可以。所以我们找到最大的\(x\)用上述方法构造即可.

注意特判一下\(k\)很大的时候,有可能会乘爆

\(Code\)

#include<bits/stdc++.h>
#define int long long
#define rg register
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
int n,k,maxx,ans;
bool check(int x){
return (1+k)*k/2<=(n/x);
}
main(){
n=read(),k=read();
if(k>2e5) puts("-1"),exit(0);
for(int i=1;i*i<=n;i++){
if(n%i!=0) continue;
if(check(i)) maxx=max(maxx,i);
if(check(n/i)) maxx=max(maxx,n/i);
}
if(!maxx) puts("-1"),exit(0);
for(int i=1;i<=k-1;i++)
cout<<i*maxx<<" ",ans+=i*maxx;
cout<<n-ans;
return 0;
}

最新文章

  1. Javascript数组操作
  2. MySQL命令大全:MySQL常用命令手册、MySQL命令行大全、查询工具
  3. 在IIS Express中调试时无法读取配置文件 错误
  4. MySql数据源配置
  5. 【转】ASP.NET数据库连接字符串总结
  6. JS 获取WEB请求路径
  7. Hadoop学习记录(5)|集群搭建|节点动态添加删除
  8. Java解析XML文档(简单实例)&mdash;&mdash;dom解析xml
  9. 浅谈Linux ftp服务器相关配置
  10. Web开发的发展
  11. 【2017-03-16】TSQL基本编程、存储过程、触发器
  12. 基于div表单模拟右对齐
  13. [one day one question] nodejs require 缓存,无法检测文件变化
  14. 调试 smallcorgi/Faster-RCNN_TF 的demo过程遇到的问题
  15. Unity User Group深圳站——Timeline &amp; Cinemachine分享
  16. java中的SHA单向加密
  17. [LeetCode&amp;Python] Problem 217. Contains Duplicate
  18. Roll a ball 学习
  19. MongoDB复制原理
  20. Spring AOP之Introduction(@DeclareParents)简介(转)

热门文章

  1. Python(七) —— mock接口开发
  2. join函数详解
  3. 【强化学习】MOVE37-Introduction(导论)/马尔科夫链/马尔科夫决策过程
  4. 【ExtJs】获取grid选中的records
  5. HTML5之客户端存储(Storage)
  6. 云端js动态效果
  7. 当在terminal中输入一行命令的时候,查找的顺序如何看
  8. shell i/o交互及重定向
  9. QTP(15)
  10. 关于VIM中展示二进制字符的操作