您的位置:首页 > 其它

hdoj 5646 DZY Loves Partition(数学)

2016-09-23 12:40 513 查看


DZY Loves Partition

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)

Total Submission(s): 1444    Accepted Submission(s): 552


Problem Description

DZY loves partitioning numbers. He wants to know whether it is possible to partition n into
the sum of exactly k distinct
positive integers.

After some thinking he finds this problem is Too Simple. So he decides to maximize the product of these k numbers.
Can you help him?

The answer may be large. Please output it modulo 109+7.

 

Input

First line contains t denoting
the number of testcases.

t testcases
follow. Each testcase contains two positive integers n,k in
a line.

(1≤t≤50,2≤n,k≤109)

 

Output

For each testcase, if such partition does not exist, please output −1.
Otherwise output the maximum product mudulo 109+7.

 

Sample Input

4
3 4
3 2
9 3
666666 2

 

Sample Output

-1
2
24
110888111

Hint
In 1st testcase, there is no valid partition.
In 2nd testcase, the partition is $3=1+2$. Answer is $1\times 2 = 2$.
In 3rd testcase, the partition is $9=2+3+4$. Answer is $2\times 3 \times 4 = 24$. Note that $9=3+3+3$ is not a valid partition, because it has repetition.
In 4th testcase, the partition is $666666=333332+333334$. Answer is $333332\times 333334= 111110888888$. Remember to output it mudulo $10^9 + 7$, which is $110888111$.

 

Source

BestCoder Round #76 (div.2)

#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
int main(void)
{
long long t, n, k, ans;
cin >> t;
while(t--)
{
ans = 1;
scanf("%lld%lld", &n, &k);
if((1+k)*k/2 > n) puts("-1");
else
{
if(n%k == 0)
{
long long avg = (n/k);
if(k%2) ans = avg;
for(int i = 1; i <= k/2; i++)
ans = ans*(avg-i)*(avg+i)%mod;
}
else
{
//base, base+1, base+2....base+k-1
//sum是假设连续,相对第一个数,后面的k-1个数多加的值
long long sum = (k-1)*k/2;
//若不连续,num不为0,num的值为需多加的1
long long num = (n-sum)%k;
long long base = (n-sum)/k;
long long i;
//因为要乘积最大,所以要从后面开始数的num个数加1
for(i = 1; i <= num; i++)
ans = ans*(base+k+1-i)%mod;
while(i <= k)
ans = ans*(base+k-i++)%mod;
}
printf("%lld\n", ans);
}
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数学 hdoj