• 南京网络赛 E K Sum


    K Sum

    终于过了这玩意啊啊啊====

    莫比乌斯反演,杜教筛,各种分块,积性函数怎么线性递推还很迷==,得继续研究研究

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define maxn 1000000+10
    int P[maxn],g[maxn];
    bool vis[maxn];
    
    unordered_map<int,int> mp;
    int T,n,k;
    const int mod =(1e9+7);
    int cnt=0;
    void init()
    {
        g[1]=1;
        for(int i=2;i<maxn;i++){
            g[i]=1;
        }
        for(int i=2; i<maxn; i++)
        {
            //g[i]=1;
            if(!vis[i])
            {
                P[cnt++]=i;
                g[i]=(i*i-1)%mod;
            }
            for(int j=0; j<cnt&&(P[j]*i)<maxn; j++)
            {
                vis[i*P[j]]=1;
                g[P[j]*i]=(g[P[j]]*g[i]%mod);
                if(i%P[j]==0)
                {
                    g[P[j]*i]=(g[i]*(P[j]*P[j])%mod)%mod;
                    break;
                }
    
            }
        }
        for(int i=1; i<maxn; i++)
        {
            g[i]=(g[i]+g[i-1]+mod)%mod;
        }
    }
    int qp(int x,int n)
    {
        int ans=1;
        
        while(n)
        {
            if(n&1)
            {
                ans=(ans*x)%mod;
            }
            x=(x*x)%mod;
            n>>=1;
        }
        return ans%mod;
    }
    int _k;
    int Sum(int x,int n)
    {
        if(x==1)
        {
            return (_k-1+mod)%mod;
        }
        else
        {
            return (((x*(qp(x,n)-1+mod)%mod)%mod*qp((x-1)%mod,mod-2)%mod)%mod-x+mod)%mod;
        }
    }
    int Sum2(int n)
    {
        int ans=qp(6,mod-2);
        ans=(ans*((n*(n+1)%mod)%mod*(2*n%mod+1)%mod)%mod)%mod;
        return ans;
    }
    int G(int n)
    {
        int ans=0;
        int r;
        for(int i=2; i<=n; i=r+1)
        {
             r=n/(n/i);
            int x=n/i;
            if(x<maxn)
            {
                ans=(ans+g[x]*(r-i+1))%mod;
            }
            else if(mp[x])
            {
                ans=(ans+mp[x]*(r-i+1))%mod;
            }
            else ans=(ans+G(x)*(r-i+1))%mod;
        }
    
        mp[n]=(Sum2(n)-ans+mod)%mod;
        return mp[n];
    }
    int cal(int x)
    {
        if(x<maxn)return g[x];
        if(mp[x])return mp[x];
        return G(x);
    }
    char s[maxn];
    signed main()
    {
        init();
        int ans=0;
        scanf("%lld",&T);
        //string s;
        while(T--)
        {
            ans=0;
            scanf("%lld",&n);
            scanf("%s",s);
            k=0;
            _k=0;
            int _n=strlen(s);
            for(int i=0; i<_n; i++)
            {
                 _k=(_k*10+s[i]-'0')%(mod);
                k=((k*10)+s[i]-'0')%(mod-1);
            }
            int r;
    
            for(int i=1; i<=n; i=r+1) ///i
            {
                r=n/(n/i);
                ans=(ans+((Sum((n/i),k))%mod*(cal(r)-cal(i-1)+mod)%mod)%mod)%mod;
            }
            cout<<ans<<'
    ';
        }
    
    
    }
  • 相关阅读:
    java之类的封装
    java飞机大战之子弹的自动生成
    java之线程飞机大战制作
    java线程游戏之背景图片的移动
    mysql的安装以及简单的命令符
    java之控制多幅图片
    java之线程
    JAVA之数组队列
    java之链表
    python之数据库的操作(课前准备)
  • 原文地址:https://www.cnblogs.com/liulex/p/11457654.html
Copyright © 2020-2023  润新知