萌新求助卡常
查看原帖
萌新求助卡常
307453
云浅知处はなび楼主2021/8/21 23:56
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>

#define int long long

using namespace std;

int f(int x){
    return x-((int)(x/2)+(int)(x/5)-(int)(x/10));
}

int S(int n,int k){
    int ans=0;
    for(int l=1,r,t;l<=n;l=r+1){
        if(k/l)r=min(k/(k/l),n);
        else r=n;
        ans+=(k/l)*(f(r)-f(l-1));
    }
    return ans;
}

int N;

signed main(void){

    cin>>N;
    int ans=0,y=1,z=1;
    while(y<=N){
        z=1;
        while(z<=N)ans+=S(N/z/y,N),z<<=1;
        y*=5;
    }
    cout<<ans<<endl;

    return 0;
}

复杂度是常数很小的 O(nlog⁡2n)O(\sqrt{n}\log^2n)

大致做法是枚举分母和分子分母的 gcd⁡\gcd,也就是一个这样的东西:

∑p=0⌊log⁡2n⌋∑q=0⌊log⁡5n⌋∑2∤k,5∤k,1≤k⌊n/(2p5q)⌋⌊nk⌋\sum_{p=0}^{\lfloor\log_2n\rfloor}\sum_{q=0}^{\lfloor\log_5n\rfloor}\sum_{2\nmid k,5\nmid k,1\le k}^{\lfloor n/(2^p5^q)\rfloor}\left\lfloor\dfrac{n}{k}\right\rfloor

然后 TLE 死了

但是这个大概只有 5e8 级别啊。。为啥会 TLE 啊

2021/8/21 23:56
加载中...