我坚持下面的问题。我的解决方案超出了时间限制。有人可以告诉我如何改进它吗?
你只需要计算不同数字(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;
}
答案 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;
}