Maximal GCD CodeForces - 803C (数论+思维优化)
1 second
256 megabytes
standard input
standard output
You are given positive integer number n. You should create such strictly increasing sequence of k positive numbers a1, a2, ..., ak, that their sum is equal to n and greatest common divisor is maximal.
Greatest common divisor of sequence is maximum of such numbers that every element of sequence is divisible by them.
If there is no possible sequence then output -1.
The first line consists of two numbers n and k (1 ≤ n, k ≤ 1010).
If the answer exists then output k numbers — resulting sequence. Otherwise output -1. If there are multiple answers, print any of them.
6 3
1 2 3
8 2
2 6
5 3
-1 题目链接:https://vjudge.net/problem/CodeForces-803C#author=0一题目大意:给你一个N和K,让你输出K个数,使其K个数的和为N,并且这K个数是严格递增的,同时要求这K个数的gcd尽可能的大。
思路:
首先我们要用思维优化一下:
通过观察数据范围,我们可以看到K最值可以取到1e10,那么题目又要输出K个数,光输出K个数的时间复杂度就是O(K)了,题目要求1000ms,肯定会TLE。
那么我们应该知道肯定当K大于一个数值的时候,就不存在答案输出-1了。
由于要求这K个数是严格递增的,那么不难想到,当gcd最小为1的时候,也是1,2,3,5,6,,..,k。
那么这K个数的总和就是(K*(1+K))/2,(等差数列的公式),即如果这个数大于N的时候,是无解的输出-1,那么根据N最大可以取到1e10,我们可以算出K的最值应该是141420,
当K>141420的时候,直接输出-1表示无解。原因上边已经论述,这时候的总和是大于1e10的,即大于N的值。
然后我们进行有解的情况。
首先要使K个数和为N,并且GCD尽可能的大, 我们应该可以得知这样一个信息,这个GCD一定是N的一个因子(因为K个数都可以被gcd整除,那么他的和也一定被gcd整除)
这样我们首先O(sqrt(N))的时间里求出N的所有因子,然后从大到小排序(贪心的思想,因为题目要求gcd尽量大)。
并且只有当n/gcd >= ((K*(1+K))/2) 的时候,才会构造出以gcd为a1值公差为gcd的等差数列。 然后我们就只需要用代码实现出这个过程就好了。(本文原文出处:https://www.cnblogs.com/qieqiemin/)
我的AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb std::ios::sync_with_stdio(false)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define gg(x) getInt(&x)
using namespace std;
typedef long long ll;
inline void getInt(int* p);
const int maxn=;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
ll n,k;
vector<ll> foc;
int main()
{
// gbtb;
// cin>>n>>k;
scanf("%lld %lld",&n,&k);
ll sum=(k*(1ll+k)/2ll);
if(sum>n||k>=141421ll)
{
// cout<<-1<<'\n';
printf("-1\n");
}else
{
if(k==1ll)
{
// cout<<n<<'\n';
printf("%lld\n",n);
}else
{
int num;
ll js=sqrt(n);
for(ll i=1ll;i<=js;i++)
{
if(n%i==)
{
foc.push_back(i);
if(i*i!=n)
{
foc.push_back(n/i);
}
}
}
sort(foc.begin(),foc.end());
reverse(foc.begin(),foc.end());
ll gcd;
num=foc.size();
for(int j=;j<num;j++)
{
ll i=foc[j];
if(n%i==)
{
ll cnt=n/i;
if(cnt>=sum)
{
gcd=i;
break;
}
}
}
ll now=gcd;
ll he=0ll;
for(ll i=1ll;i<=k-;i++)
{
he+=now;
printf("%lld ",now);
now+=gcd;
}
printf("%lld ",n-he);
}
}
return ;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '');
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * - ch + '';
}
}
else {
*p = ch - '';
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * + ch - '';
}
}
}
Maximal GCD CodeForces - 803C (数论+思维优化)的更多相关文章
- AC日记——Maximal GCD codeforces 803c
803C - Maximal GCD 思路: 最大的公约数是n的因数: 然后看范围k<=10^10; 单是答案都会超时: 但是,仔细读题会发现,n必须不小于k*(k+1)/2: 所以,当k不小于 ...
- CodeForce-803C Maximal GCD(贪心数学)
Maximal GCD CodeForces - 803C 现在给定一个正整数 n.你需要找到 k 个严格递增的正整数 a1, a2, ..., ak,满足他们的和等于 n 并且他们的最大公因数尽量大 ...
- codeforces 803C Maximal GCD(GCD数学)
Maximal GCD 题目链接:http://codeforces.com/contest/803/problem/C 题目大意: 给你n,k(1<=n,k<=1e10). 要你输出k个 ...
- Codeforces 803C. Maximal GCD 二分
C. Maximal GCD time limit per test: 1 second memory limit per test: 256 megabytes input: standard in ...
- Codeforces H. Maximal GCD(贪心)
题目描述: H. Maximal GCD time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Educational Codeforces Round 20 C. Maximal GCD
C. Maximal GCD time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)
[BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...
- 【CodeForces 803 C】Maximal GCD(GCD+思维)
You are given positive integer number n. You should create such strictly increasingsequence of k pos ...
- codeforces 798 C. Mike and gcd problem(贪心+思维+数论)
题目链接:http://codeforces.com/contest/798/problem/C 题意:给出一串数字,问如果这串数字的gcd大于1,如果不是那么有这样的操作,删除ai, ai + 1 ...
随机推荐
- 浅析JAVA中堆内存与栈内存的区别
Java把内存划分成两种:一种是栈内存,一种是堆内存. 一.栈内存 存放基本类型的变量,对象的引用和方法调用,遵循先入后出的原则. 栈内存在函数中定义的“一些基本类型的变量和对象的引用变量”都 ...
- Sketch webView方式插件开发技术总结
相信大家都对Sketch有一定的了解和认识.除了基础的矢量设计功能以外,插件更是让Sketch保持强大的独门秘籍.Sketch开放了第三方插件接口,设计师可以在几百种的插件中轻松找到适合自己工作方式的 ...
- 组件的三大属性state,props,refs与事件处理
组件的三大属性state state是组件对象最重要的属性, 值是对象(可以包含多个数据),组件被称为"状态机", 通过更新组件的state来更新对应的页面显示(重新渲染组件) 初 ...
- 【Odoo 8开发教程】第二章:Odoo生产环境部署设置
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/10792977.html 一:dbfilter 数据库访问规则设置 一个odoo实例可以连接到不同的数据库实例中 ...
- LabelImg 图像图像标注工具
https://github.com/tzutalin/labelImg windos版本请不要把存放在中文目录下,否则打不开.
- erc721-165学习
ERC165: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md 就是一种发布并能检测到一个智能合约实现了什么接口的标准 这么做 ...
- rsyslog和logrotate服务
参考: http://www.lampbo.org/others/opensource/rsyslog-config-file-detail.html http://bangerlee.blog.ch ...
- 原生js函数的伪重载
一.我们在学习java的时候,其中方法有一个比较的重要的特性重载,根据传入的参数的个数来执行不同的方法,而方法其根据签名来判断,而JavaScript却不能根据方法的签名来进行重载,只能通过参数的个数 ...
- 使用systemctl报错(centos 7)
服务器运行210多天,今天使用systemctl准备重启下sshd发现报错,如上图. systemctl restart.stop.status.start等所有操作都报错.原因未知. 在此之前有内存 ...
- GIT 远程仓库:添加远程库、从远程库克隆
到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题了. 可是有用过集中式版本控制系统SVN的童鞋会站出来说,这些功能在SVN里早就有了,没看出Gi ...