为什么在此代码中使用(long long)强制转换会改变结果?

时间:2016-01-04 00:16:32

标签: c++ casting

我在链接https://www.codechef.com/JAN16/problems/RGAME

中为这个问题编写了这些代码

代码1>>

#include<iostream>
#include<bits/stdc++.h>
using namespace std;

int main(){
long long int t[100001],i,MOD=1000000007;
t[0]=1;
for(i=1;i<100001;i++){
    t[i]=(t[i-1]*2)%MOD;
    //cout<<t[i]<<endl;
}
int test;
cin>>test;
long long int n,a[100001];
while(test--){
    cin>>n;
    for(i=0;i<=n;i++)
        cin>>a[i];
    long long int j=(2*a[0])%MOD;
    long long int s=0;
    for(i=1;i<=n;i++){
        int x = (j * ((a[i] * t[n - i]) % MOD)) % MOD;
        s = (s+ x) % MOD;
        j = (j + (a[i] * t[i]) % MOD) % MOD;
    }
    cout<<s<<endl;
}
return 0;
}

代码2&gt;&gt;

#include<iostream>
#include<bits/stdc++.h>
using namespace std;

int main(){
long long int t[100001],i,MOD=1000000007;
t[0]=1;
for(i=1;i<100001;i++){
    t[i]=(t[i-1]*2)%MOD;
    //cout<<t[i]<<endl;
}
int test;
cin>>test;
long long int n,a[100001];
while(test--){
    cin>>n;
    for(i=0;i<=n;i++)
        cin>>a[i];
    long long int j=(2*a[0])%MOD;
    long long int s=0;
    for(i=1;i<=n;i++){
        int x = ((long long)(j) * (((long long)(a[i]) * t[n - i]) % MOD)) % MOD;
        s = (s+ x) % MOD;
        j = (j + ((long long)(a[i]) * t[i]) % MOD) % MOD;
    }
    cout<<s<<endl;
}
return 0;
}

可以看出,在代码1中,虽然将它们声明为long long,但在for循环中进行计算时我没有类型转换变量j和a [i]。在代码2中,我使用了类型转换。 据我所知,两个代码之间没有区别。但是在提交时我得到了代码1的错误答案并接受了代码2.所以在我看来,在for循环中完成的类型转换是必要的,有人可以告诉我为什么这样吗?

1 个答案:

答案 0 :(得分:0)

试试这个

int x = (((a[i] * t[n - i]) % MOD) * j) % MOD;
s = (s + x) % MOD;
j = ((a[i] * t[i]) % MOD + j) % MOD;

如果您想要添加两个不同的值,请将较长的值放在第一位......

编辑:

如果s + x> 2 ^^ 31 - 1,需要另一种类型转换:

s = (1LL * s + x) % MOD;