码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5646 DZY Loves Partition

时间:2016-03-19 22:37:43      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5646

题意:给出n和k,求把n拆成k个不同整数,且这些整数的乘积最大时的乘积,输出时对1e9+7取余。

思路:要乘积最大,可以想到这些拆分成的数是连续的,或者中间隔一个的。先求出一段连续的整数的和与n的差最小,然后把还少的部分x加在前x大的数上去就可以了。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 //#include <bits/stdc++.h>
 5 using namespace std;
 6 int T;
 7 const long long mod = 1e9+7;
 8 int main() 
 9 {
10     scanf("%d", &T);
11     int n, k;
12     while(T--)
13     {
14         scanf("%d%d", &n, &k);
15         if(k >= 44721)
16         {
17             printf("-1\n"); continue;
18         }
19         long long sum = 1+k;
20         sum *= k; sum /= 2;
21         if(sum > n)
22         {
23             printf("-1\n"); continue;
24         }
25         n = n - sum;
26         int l = n/k; int r = n%k;
27         long long ans = 1;
28         for(int i = 1; i <= k-r; i++)
29         {
30             ans = ans*(l+i)%mod;
31         }
32         for(int i = k; i > k-r; i--)
33         {
34             ans = ans*(l+i+1)%mod;
35         }
36         cout<<ans<<endl;
37        
38     }
39     return 0;
40 }

 

hdu 5646 DZY Loves Partition

标签:

原文地址:http://www.cnblogs.com/titicia/p/5296360.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!