zoukankan      html  css  js  c++  java
  • [BZOJ4916]神犇(Monster_Qi)和蒟蒻(SWHsz)

    很久很久以前,有一只神犇叫Monster_Qi;
    很久很久之后,有一只蒟蒻叫SWHsz;

    1<=N<=1E9,A、B模1E9+7;
    求这个。
    求μ的话直接输出1就行了因为除了1的平方外都有平方因子。
    求φ的话就有个显而易见的结论就是(φ(n^2)=φ(n)n),列出φ的一般式就行了。
    然后就是套杜教筛的模板了。
    要凑 (f cdot g=h)
    $ h(i)=sum _{d|i} φ(d)dg(i/d) ( 显而易见的,g是)id(函数,)h(i)=i^2$
    然后随便搞了。

    #include <iostream>
    #include <cstdio>
    #include <map>
    using namespace std;
    map<long long,long long>mp;
    long long n;
    const int N = 10000005,NI2=500000004,NI6=166666668,mod=1e9+7;
    long long ph[N],prime[N],cnt;
    bool vis[N];
    void phhh() {
        ph[1]=1;
        for(int i=2; i<=N-5; i++) {
            if(!vis[i]) prime[++cnt]=i,ph[i]=i-1;
            for(int j=1; j<=cnt; j++) {
                if(i*prime[j]<=N-5) vis[i*prime[j]]=1;else break;
                if(i%prime[j]==0){ph[i*prime[j]]=ph[i]*prime[j];break;}
                else ph[i*prime[j]]=ph[i]*ph[prime[j]];
            }
        }
        for(int i=1;i<=N-5;i++) ph[i]=(ph[i]*i+ph[i-1])%mod;
    }
    long long solve(long long x) {
    	if(N-5>=x) return ph[x];
    	if(mp.count(x)) return mp[x];
    	long long ans=x*((x+1)%mod)%mod*((2*x%mod+1)%mod)%mod*NI6%mod;
    	for(long long i=2,nxti;i<=x;i=nxti+1) {
    		nxti=x/(x/i);
    		ans=(ans-(nxti+i)%mod*(nxti-i+1ll)%mod*NI2%mod*solve(x/i))%mod;
    	}
    	return mp[x]=(ans+mod)%mod;
    }
    int main() {
    	phhh();
    	scanf("%lld",&n);
    	printf("1
    %lld",solve(n));
    }
    
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    [NOIP2011] 玛雅游戏
    [bzoj4025] 二分图
    [10.2模拟] tree
    [10.3模拟] color
    [10.2模拟] teach
    [10.2模拟] plan
    [10.2模拟] book
    [bzoj4999] This Problem Is Too Simple!
    [9.28模拟] good
    [bzoj3884] 上帝与集合的正确用法
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9608634.html
Copyright © 2011-2022 走看看