Codeforces Beta Round 10 C

发布时间 2023-12-04 19:56:52作者: ycllz

111
发现d(x)只有0-9的值
我们可以把按d(x)来分类
发现要只计算
我们就可以枚举d(C)d(a)d(b)贡献就是 这三个任选
要是有前面限制呢 我打了一下表 发现要是AB=C 那么肯定满足后面
这样我们就只用枚举C然后算他有多少对因子即可
然后发现C是1-n 连续的 可以直接枚举因子A 就可以快速算出有多少对

void solve(){
    int n;cin>>n;
    vector<int>d[10],D[10];
    for(int i=1;i<=81;i++){
        int x=i;
        while(x>=10){
            int now=0;
            while(x)now+=x%10,x/=10;
            x=now;
        }
        D[x].push_back(i);
    }
    vector<int>mp(n+1);
    for(int i=1;i<=n;i++){
        int x=i;
        while(x>=10){
            int now=0;
            while(x)now+=x%10,x/=10;
            x=now;
        }
        d[x].push_back(i);
        mp[i]=x;
    }
    long long ans=0;
    for(int i=1;i<=n;i++){
        ans-=n/i;
    }
    for(int i=0;i<=9;i++){
        for(auto j:D[i]){
            if(j>81)break;
            for(int l=1;l<=9;l++){
                if(j%l)continue;
                int r=j/l;
                if(r>=10)continue;
//                cout<<i<<" "<<l<<' '<<r<<endl;
//                cout<<(int)d[l].size()*(int)d[r].size()*(int)d[i].size()<<endl;
                ans+=(long long)d[l].size()*(long long)d[r].size()*(long long)d[i].size();
            }
        }
    }
    cout<<ans<<endl;
}