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

Why does using a (long long) cast in this code change the result?

本文关键字:转换 结果 long-long 代码 为什么      更新时间:2023-10-16

我为链接中的问题编写了这些代码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>>

#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中,在for循环中进行计算时,我没有键入casted变量j和a[I],尽管它们被声明为long-long。在代码2中,我使用了类型转换。据我所知,这两种代码没有区别。但在提交时,我得到了代码1的错误答案,并接受了代码2。所以在我看来,在for循环中进行类型转换是不必要的,有人能告诉我为什么吗?

尝试这个

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;