题目链接: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 "); continue; 18 } 19 long long sum = 1+k; 20 sum *= k; sum /= 2; 21 if(sum > n) 22 { 23 printf("-1 "); 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 }