我在链接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循环中完成的类型转换是必要的,有人可以告诉我为什么这样吗?
答案 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;