-1

我被困在下面的问题上。我的解决方案超过了时间限制。有人可以告诉我如何改进它吗?

您只需要计算不同数字 (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≤镍≤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;
}
4

1 回答 1

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;
 }
于 2013-03-17T20:20:36.203 回答