hdu 5646 DZY Loves Partition

题目链接: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 }

 

posted @ 2016-03-19 21:18  下周LGD该赢了吧  阅读(182)  评论(0编辑  收藏  举报