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