今天比赛T3明明已经几乎做出来了(我认为的),但是却总是调不对。调试一看发现一些值莫名其妙地就溢出成负数了,根本不知道怎么回事。我tm调了20多分钟硬是没搞明白哪里出了问题。
若不是T3死也调不出来我就AK这场比赛了啊啊啊,我就成为第二个AK比赛的绿勾了啊啊啊。可恶没办法跟同学装波一了,太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了太可恶了
代码如下求大佬指点
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N = 10005;
const int M = 998244353;
int n,m,a[N];
int po2[100];
int st[70][100];
int stnum[70][100];
int rst[70];
int f[1000] = {0,0,0,0,1,2,1,3,2,4,3,1,5,4,2,6,5,3,7,6,2,4,8,7,3,5,9,8,4,6,10,9,5,7,11,10,6,3,8,12,11,7,4,9,13,12,8,5,10,14,13,9,6,11,15,14,10,7,12,16,15,11,8,13,17,16,12,9,14,18,2,17,13,10,15,19,3,18,14,11,16,20,4,19,15,12,17,21,5,20,16,13,18,22,6,21,17,14,19,23,7};
inline int get(int x){
x--;
int cnt = 0;
while(x>1){
cnt++;
x >>= 1;
}
return cnt;
}
inline int cal(int x,int len){
return ((x+x+len-1)*len/2)%M;
}
signed main(){
ios::sync_with_stdio(false);
po2[0] = 1;
for(int i=1;i<=61;i++){
po2[i] = po2[i-1]*2;
}
for(int i=1;i<=61;i++){
int need = i+po2[i];
if(i==1) need = 4;
int pos = get(need);
st[i][pos] = need;
stnum[i][pos] = 1;
rst[i] = f[i]+1;
//cout<<i<<' '<<pos<<' '<<st[i][pos]<<' '<<stnum[i][pos]<<endl;
for(int j=pos+1;j<=61;j++){
int tmpst = po2[j];
st[i][j] = tmpst+(j-1-(tmpst-st[i][j-1])%(j-1));
stnum[i][j] = stnum[i][j-1]+(st[i][j]-st[i][j-1])/(j-1);
//cout<<i<<' '<<j<<' '<<st[i][j]<<' '<<stnum[i][j]<<endl;
}
}
int t;
cin>>t;
while(t--){
cin>>n;
int tmpn = get(n);
int ans = 0;
for(int i=1;i<=64;i++){
int addn = 0,endn = 0;
if(i+po2[i]>n) break;
if(n<st[i][tmpn]){
endn = stnum[i][tmpn]-1;
}
else{
endn = stnum[i][tmpn]+(n-st[i][tmpn])/tmpn;
}
//cout<<i<<' '<<endn<<endl;
ans = (ans+cal(rst[i],endn))%M;
}
cout<<ans<<endl;
}
return 0;
}