codeforces 803C Maximal GCD(GCD数学)

Maximal GCD

题目链接:http://codeforces.com/contest/803/problem/C

    ——每天在线,欢迎留言谈论。

题目大意:

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

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

①这k个数之和等于n

②严格递增

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

思路:

一、先找出这个符合条件的最大的q:

①q一定是n的 公约数

②q*(1+2+···+k)<=n 时的q就可以成为共约数(因为输出时 只需要把k增大到m,m满足 1+2+··+(k-1)+m=n/q 就可以)

③在n的公约数中从大到小遍历是否符合条件即可。

↓ ↓ ↓ ↓ 不超时的一种 遍历公约数 的思想!

只需要通过for(long long i=1;i<sqrt(n);i++)来找出最大的那个q

假如2是他的一个约数,那么n/2也是。3是的话n/3也是。所以循环到sqrt(n)即可。最多1e5次循环 不会超T。

二、输出这k个数

q*a1,q*a2,q*a3 ······ q*ak(没有,号,只是好看)

其中的{a1,a2,a3···ak}={1,2,3 ··· (k-2) , (k-1) , ((n/q)- sum)}(sum=1+2+···+(k-1))

PS注意:k好大时 long long 也装不下(1+2+···+k)!(不说太清楚,自己体会,哈哈...)

AC代码:

 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4 int main()
 5 {//1<=n,k<=1e10
 6     long long n,k,sqr,cadd,q;//q为最大公约数
 7     cin>>n>>k;
 8     if(k>141420)
 9     {
10         cout<<"-1"<<endl;return 0;
11     }
12     cadd=(1+k)*k/2;sqr=sqrt(n);q=0;
13     for(long long i=1;i<=sqr;i++)
14     {
15         if(n%i==0)
16         {
17             if(i>=cadd)
18                 {q=n/i;break;}
19             else if(n/i>=cadd)
20                     q=i;
21         }
22     }
23     //cout<<q<<endl;
24     if(!q)
25     {
26         cout<<"-1"<<endl;return 0;
27     }
28     long long sum=0,i;
29     for(i=1;i<k;i++)
30     {
31         cout<<i*q<<" ";sum+=i;
32     }
33     cout<<q*(n/q-sum)<<endl;
34     return 0;
35 }

 2017-05-04 14:06:58 -> 2017-05-05 12:51:05 -> 2017-05-05 20:45:26

转载于:https://www.cnblogs.com/Twobox/p/6806829.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值