我正在解决有关spoj的问题,SPOJ CARDS 问题很容易,我得到的是小数的正确输出,但是由于整数溢出,似乎spoj无法接受, 那我应该使用什么整数类型?
或者还有其他不接受它的问题吗?我也不知道它可能会失败的测试用例
其他一些似乎使用相同逻辑的公认解决方案,那里的解决方案被接受accepted sol
测试用例:
2
3
7
输出:
15
77
。
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
unsigned long long int sum1=0;
unsigned long long int sum2=0;
sum1=((n*(n-1))/2)%1000007;
// cout<<"sum1 is"<<sum1;
sum2=(n*n+n)%1000007;
cout<<(sum1+sum2)%1000007<<endl;
}
}
编辑
当我使用unsigned long long n但n的最大值为 1000 000,那么它也应该在int n中被接受,因为nmax在int范围内
答案 0 :(得分:2)
当int
大时,您的代码会在n * (n - 1)
和n * n
乘法中溢出n
的范围。
它与操作顺序有关。例如,(n * n + n) % 1000007;
在这里,首先计算n * n
。结果大于int
所能容纳的范围,因此会出现整数溢出。由于溢出,结果int
的值小于应有的值。对于太小的值,添加了n
。这导致另一个int
太小。太小的值除以2
。最后,执行%
。
一个简单的解决方法是像这样声明n
:
unsigned long long n;
通过将n
的类型更改为unsigned long long
,由于计算的第一步是在unsigned long long
上进行的,因此计算的每个步骤都将是n
的类型