ARC113 A-A*B*C (pretreatment)

Title:

Insert picture description here

solution:

枚举a,那么问题变为计算b*c<=k/a的数对数量.

设f[i]为b*c=i的数量,那么f[]的前缀和就是b*c<=i的数量.
f[i]可以枚举b的因子O(sq(i))计算,预处理[1,n]的f[]复杂度为O(n*sq).

预处理完f[],并计算前缀和之后,[1,k]内枚举i,ans+=f[k/i]即可.

code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e5+5;
int f[maxm];
signed main(){
    
    
    ios::sync_with_stdio(0);
    int k;cin>>k;
    //f[i]为x*y=i的数量.
    for(int i=1;i<maxm;i++){
    
    
        for(int j=1;j*j<=i;j++){
    
    
            if(i%j==0){
    
    
                f[i]++;
                if(i/j!=j)f[i]++;
            }
        }
    }
    //f[]的前缀和就是x*y<=i的数量
    for(int i=1;i<maxm;i++){
    
    
        f[i]+=f[i-1];
    }
    //枚举i,ans+=f[k/i].
    int ans=0;
    for(int i=1;i<=k;i++){
    
    
        ans+=f[k/i];
    }
    cout<<ans<<endl;
    return 0;
}

Guess you like

Origin blog.csdn.net/weixin_44178736/article/details/113925432
Recommended