zoukankan      html  css  js  c++  java
  • luogu P5221 Product |莫比乌斯反演

    题目背景

    ({ m CYJian}):"听说(gcd)(sum)套起来比较好玩??那我就......"
    题目描述

    ({ m CYJian})最近闲的玩起了(gcd)。。他想到了一个非常简单而有意思的式子:

    (prod_{i=1}^Nprod_{j=1}^Nfrac{lcm(i,j)}{gcd(i,j)} (mod 104857601)) (mod 104857601)

    ({ m CYJian})已经算出来这个式子的值了。现在请你帮他验算一下吧。({ m CYJian})只给你(0.2s)的时间哦。

    输入格式

    一行一个正整数(N)

    输出格式

    一行一个正整数,表示答案模(104857601)的值。



    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    inline int read(){
    	int x=0; char c=getchar();
    	while(c<'0'||c>'9')c=getchar();
    	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48); c=getchar();}
    	return x;
    }
    #define ll long long
    const int N=1e6+5,mod=104857601;
    short mu[N];
    int pri[N],tot;
    bool vis[N];
    inline void Mubius(int n){
    	mu[1]=1; 
    	for(int i=2;i<=n;i++){
    		if(!vis[i]){ pri[++tot]=i; mu[i]=-1; }
    		for(int j=1;j<=tot&&pri[j]*i<=n;j++){
    			vis[pri[j]*i]=1;
    			if(i%pri[j])mu[i*pri[j]]=-mu[i];
    			else { mu[i*pri[j]]=0; break; }
    		}
    	}
    	for(int i=2;i<=n;i++)mu[i]+=mu[i-1];
    }
    inline ll sum(int n){
    	ll ans=0;
    	for(int i=1,j=0;i<=n;i=j+1){
    		j=n/(n/i);
    		ans+=1ll*(mu[j]-mu[i-1])*(n/i)*(n/i);
    	}
    	return ans;
    }
    inline ll ksm(ll x,ll y){
    	int res=1;
    	while(y){
    		if(y&1)res=res*x%mod;
    		x=x*x%mod; y>>=1;
    	}
    	return res;
    }
    signed main(){
    	int n=read();
    	Mubius(n);
    	ll ans=1,op=1;
    	for(int i=1;i<=n;i++){
    		ans=ans*ksm(i,sum(n/i))%mod;
    		op=op*i%mod;
    	}
    	cout<<ksm(ans*ans%mod,mod-2)*ksm(op,2*n)%mod<<endl;
    }
    
  • 相关阅读:
    wordpress建个人博客
    函数(一)
    字符串格式化
    集合运算
    基本数据类型(二)
    基本数据类型(一)
    分享一个下片神器
    Proxyee
    基本运算符
    条件语句和while循环
  • 原文地址:https://www.cnblogs.com/naruto-mzx/p/13150949.html
Copyright © 2011-2022 走看看