题目链接

https://vjudge.net/contest/394826#problem/F

题目大意

求与7无关数的平方和。
与7无关:不能被7整除,十进制各个位不含7。

解题思路

前缀和,太简单了。这不是我想讲的。

WA代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
ll n,t;
ll ans[N];
bool is_7(int x){
    if(x%7==0) return 1;
    while(x){
        if(x%10==7) return 1;
        x/=10;
    }
    return 0;
}
int main(){
    cin>>t;
    for(int i=1;i<=1e6;i++){//唯一区别
        ans[i]=ans[i-1];
        if(!is_7(i)) ans[i]+=i*i;
    }
    while(t--){
        cin>>n;
        cout<<ans[n]<<endl;
    }
}

AC代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
ll n,t;
ll ans[N];
bool is_7(int x){
    if(x%7==0) return 1;
    while(x){
        if(x%10==7) return 1;
        x/=10;
    }
    return 0;
}
int main(){
    cin>>t;
    for(ll i=1;i<=1e6;i++){//唯一区别
        ans[i]=ans[i-1];
        if(!is_7(i)) ans[i]+=i*i;
    }
    while(t--){
        cin>>n;
        cout<<ans[n]<<endl;
    }
}

总结

我想表达啥?要用longlong不能用int表示i,尽管i最大为1e6,但是ans要加的是ii,假如i=1e6,那么ii=1e12,超出int范围,发生溢出,底层数据被截断,导致结果出错!
我真的是忽略了这点,直到对比了好几遍代码,才发现了错因,引以为戒!