zoukankan      html  css  js  c++  java
  • LOJ #6053. 简单的函数

    $Min$_$25$筛模版题

    为什么泥萌常数都那么小啊$ QAQ$

    传送门:Here


    题意:

    $ f(1)=1$
    $ f(p^c)=p⊕c(p 为质数,⊕ 表示异或)$
    $ f(ab)=f(a)f(b)(a 与 b 互质)$

    求$ sumlimits_{i=1}^n f(i)$


    $ solution:$ 

    显然有$ f(P_i)=P_i-1+2*[P_i=2]$

    暂时忽略$ P_i=2$的情况求出质数贡献

    然后再把答案$ +2$即可


    $ my code: $

    #include<ctime>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #define p 1000000007
    #define M 200010
    #define rt register int
    #define ll long long
    using namespace std;
    inline ll read(){
        ll x = 0; char zf = 1; char ch = getchar();
        while (ch != '-' && !isdigit(ch)) ch = getchar();
        if (ch == '-') zf = -1, ch = getchar();
        while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); return x * zf;
    }
    void write(ll y){if(y<0)putchar('-'),y=-y;if(y>9)write(y/10);putchar(y%10+48);}
    void writeln(const ll y){write(y);putchar('
    ');}
    int i,j,k,m,x,y,z,cnt,sz;ll n;
    int sp[M],ss[M];bool pri[M];
    int id1[M],id2[M],t,h[M];ll g[M],q[M];
    #define inv2 500000004
    void init(){
        sz=sqrt(n);
        for(rt i=2;i<=sz;i++){
            if(!pri[i])ss[++cnt]=i,sp[cnt]=(sp[cnt-1]+i)%p;
            for(rt j=1;i*ss[j]<=sz&&j<=cnt;j++){
                pri[i*ss[j]]=1;
                if(i%ss[j]==0)break;
            }
        }
        for(ll i=1;i<=n;){
            ll v=n/i;ll R=n/v;q[++t]=v;
            if(v<=sz)id1[v]=t;else id2[R]=t;
            v%=p;h[t]=v-1;g[t]=v*(v+1)%p*inv2%p-1;
            i=R+1;
        }
    }
    inline int id(const ll x){return x<=sz?id1[x]:id2[n/x];}
    int S(ll x,int y){
        if(x<=1||ss[y]>x)return 0;
        ll ret=g[id(x)]-sp[y-1]+y-1;
        for(rt i=y;(ll)ss[i]*ss[i]<=x&&i<=cnt;i++)
        for(ll j=ss[i],e=1;j*ss[i]<=x;j*=ss[i],e++)
        (ret+=(ll)(ss[i]^e)*S(x/j,i+1)+(ss[i]^e+1))%=p;
        
        return ret;
    }
    int main(){
        n=read();init();
        for(rt j=1;j<=cnt;j++)
        for(rt i=1;i<=t&&q[i]>=(ll)ss[j]*ss[j];i++){
            const int k=id(q[i]/ss[j]);
            (g[i]-=(ll)ss[j]*(g[k]-sp[j-1]))%=p;
            (h[i]-=(h[k]-j+1))%=p;
        }
        for(rt i=1;i<=t;i++)(g[i]-=h[i])%=p;
        if(n==1)cout<<1;else cout<<(S(n,1)+3+p)%p;
        return 0;
    }
  • 相关阅读:
    eclipse自动切换到debug视图
    Android Studio 1.1.0 “关联源码” 或者“导入源码” ,又或者插件包
    Eclipse中如何安装和使用GrepCode插件 (转)
    转【Python】同时向控制台和文件输出日志logging
    AngularJs学习
    MongoDB聚合运算之mapReduce函数的使用(11)
    MongoDB聚合运算之group和aggregate聚集框架简单聚合(10)
    MongoDB的分片(9)
    MongoDB replication set副本集(主从复制)(8)(转)
    MongoDB的导入导出(7)
  • 原文地址:https://www.cnblogs.com/DreamlessDreams/p/9998936.html
Copyright © 2011-2022 走看看