1 条题解

  • 0
    @ 2025-10-8 16:51:13

    题解:https://blog.csdn.net/tenkuo/article/details/149963746?spm=1001.2014.3001.5501

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    template<typename T> void qread(T &x){
    	x=0; int f=1; char c=getchar();
    	for(; !isdigit(c); c=getchar()) if(c=='-') f=-1;
    	for(; isdigit(c); c=getchar()) x=x*10+(c-'0');
    	x*=f;
    }
    typedef long long LL;
    const int N=5e7+10;
    const LL P=1e9+7;
    LL n, f[N];
    //g[i]代表 i里面有多少它最小质因子的幂次(看到后面就懂了) 
    int pr, prime[N], g[N];
    bool v[N];
    LL q_pow(LL a, LL b){
    	LL res=1;
    	while(b){
    		if(b&1) res=res*a%P;
    		a=a*a%P; b/=2;
    	}
    	return res;
    }
    void init(){
    	pr=0; memset(v, 0, sizeof(v));
    	f[1]=1; //积性函数的 1都得是 1 
    	for(int i=2; i<=N-10; i++){
    		if(!v[i]){
    			pr++, prime[pr]=i;
    			f[i]=2*i-1; g[i]=1;
    		}
    		for(int j=1; (j<=pr) && (i*prime[j]<=N-10); j++){
    			int p=prime[j];
    			v[i*p]=1;
    			if(i%p==0){
    				g[i*p]=g[i]+1; //这玩意可不经 mod啊 
    				
    				LL t=q_pow(p, g[i]);
    				f[i*p]=f[i/t]*(f[t]*p%P+(p-1)*t%P)%P;
    				break;
    			}
    			else{
    				g[i*p]=g[p];
    				f[i*p]=f[i]*f[p]%P;
    			}
    		}
    	}
    	for(int i=2; i<=N-10; i++){
    		f[i]=f[i]*f[i-1]%P;
    	}
    }
    int main(){
    	init();
    	qread(n);
    	printf("%lld\n", f[n]);
    	return 0;
    }
    
    • 1

    *【莫比乌斯反演:衍生练习】之乎者也(by lzy)

    信息

    ID
    515
    时间
    3000ms
    内存
    1024MiB
    难度
    8
    标签
    递交数
    82
    已通过
    11
    上传者