• 【洛谷P2257】YY的GCD


    题目大意:求$$sumlimits_{pin prime}sumlimits_{i=1}^nsumlimits_{j=1}^m[gcd(i,j)=p]$$

    题解:忽略最外层的求和式,其余部分可以直接利用狄利克雷卷积+除法分块进行计算。对于最外层的和式来说,直接枚举素数会超时。考虑设 (t=pd),这样就在两个独立的和式之间建立了关系,可以达到优化的作用。

    代码如下

    #include <bits/stdc++.h>
    typedef long long ll;
    using namespace std;
    const int maxn=1e7+10;
    
    int n,m;
    int mu[maxn],prime[maxn],tot,f[maxn],sum[maxn];
    bool vis[maxn];
    
    void seive(){
    	mu[1]=1;
    	for(int i=2;i<=1e7;i++){
    		if(!vis[i])prime[++tot]=i,mu[i]=-1;
    		for(int j=1;i*prime[j]<=1e7;j++){
    			vis[i*prime[j]]=1;
    			if(i%prime[j]==0)break;
    			mu[i*prime[j]]=-mu[i];
    		}
    	}
    	for(int i=1;i<=tot;i++)
    		for(int j=1;j*prime[i]<=1e7;j++)
    			f[prime[i]*j]+=mu[j];
    	for(int i=1;i<=1e7;i++)sum[i]=sum[i-1]+f[i];
    }
    
    void solve(){
    	ll ans=0;
    	for(int i=1;i<=n;i++){
    		int j=min(n/(n/i),m/(m/i));
    		ans+=(ll)(sum[j]-sum[i-1])*(ll)(n/i)*(ll)(m/i);
    		i=j;
    	}
    	printf("%lld
    ",ans);
    }
    
    int main(){
    	seive();
    	int T;scanf("%d",&T);
    	while(T--){
    		scanf("%d%d",&n,&m);
    		if(n>m)swap(n,m);
    		solve();
    	}
    	return 0;
    }
    
  • 相关阅读:
    安装 Cacti 监控
    增加yum源方式 安装升级 Mysql
    Yum
    Cacti 抓取数据方式 安装spine
    Linux 目录解析
    Linux 发行版本简述
    php 安装扩展插件实例-ftp.so
    Crontab 计划任务
    文本处理命令 cat more less cut wc sort uniq
    grep命令
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10713469.html
Copyright © 2020-2023  润新知