三个不同的数字

时间:2013-03-17 19:15:40

标签: c++ algorithm

我坚持下面的问题。我的解决方案超出了时间限制。有人可以告诉我如何改进它吗?

你只需要计算不同数字(X1,X2,X3)的有序三元组的数量,其中Xi可以是从1到Ni的任何正整数,包括(i = 1,2,3)。 数字N1,N2,N3可以达到10 ^ 18。 因此,答案可能非常大。因此你应该以模10 ^ 9 + 7输出它。

输入

输入的第一行包含一个整数T,表示测试用例的数量。下面是T测试用例的描述。每个测试用例的唯一行包含三个以空格分隔的整数N1,N2,N3。

输出

对于每个测试用例,输出一行包含模数为10 ^ 9 + 7的所需三元组数。

约束

1≤T≤1000

1≤Ni≤10^ 18

Example

Input:

5

3 3 3
2 4 2
1 2 3
25 12 2012
1 1 2013

Output:
6
4
1
578880
0

这是我的解决方案:

#include <iostream>

using namespace std;

int main()
{
int t;
scanf("%d",&t);
for(int i=0; i<t; i++)
{
    long long unsigned a,b,c,sum=0,s1,s2,s3;
    scanf("%llu %llu %llu", &a,&b,&c);
    for(s1=1; s1<=a; s1++)
    {
        for(s2=1; s2<=b; s2++)
        {
            if(s1==s2) continue;
            for(s3=1; s3<=c; s3++)
            {
                if(s1==s3 || s2==s3) continue;
                sum=(sum+1)%1000000007;
            }
        }
    }
    printf("%llu\n",sum);
}
return 0;
}

1 个答案:

答案 0 :(得分:1)

我发现你可以轻松计算出有序三元组的数量,所以这就是解决方案:

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
const long long unsigned the_prime= 1000000007;
int t;
scanf("%d",&t);
for(int i=0; i<t; i++)
{
    long long unsigned m[3],res=0;
    scanf("%llu %llu %llu", &m[0],&m[1],&m[2]);
    sort(m,m+3);
    res=((((m[0]%the_prime)*((m[1]-1)%the_prime))%the_prime)*((m[2]-2)%the_prime))%the_prime;
    printf("%llu\n",res);
}
return 0;
 }