zoukankan      html  css  js  c++  java
  • 【UVa11426】GCD

    【UVa11426】GCD - Extreme (II)(莫比乌斯反演)

    题面

    Vjudge

    题解

    这。。
    直接套路的莫比乌斯反演
    我连式子都不想写了
    默认推到这里把。。
    然后把(ans)写一下

    [ans=sum_{d=1}^ndsum_{i=1}^{n/d}mu(i)[frac{n}{id}]^2 ]

    (T=id)
    然后把(T)提出来

    [ans=sum_{T=1}^n[frac{n}{T}]^2sum_{d|T}dmu(frac{T}{d}) ]

    后面那一堆东西直接线性筛
    前面数论分块
    单次询问复杂度(O(sqrt n))
    最后别忘记题目求的是什么

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<set>
    #include<map>
    #include<vector>
    #include<queue>
    using namespace std;
    #define MAX 4000000
    inline int read()
    {
    	int x=0,t=1;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=-1,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return x*t;
    }
    bool zs[MAX+10];
    int pri[MAX+10],tot;
    long long s[MAX+10];
    void pre()
    {
    	zs[1]=true;s[1]=1;
    	for(int i=2;i<=MAX;++i)
    	{
    		if(!zs[i])pri[++tot]=i,s[i]=i-1;
    		for(int j=1;j<=tot&&i*pri[j]<=MAX;++j)
    		{
    			zs[i*pri[j]]=true;
    			if(i%pri[j])s[i*pri[j]]=s[i]*s[pri[j]];
    			else{s[i*pri[j]]=s[i]*pri[j];break;}
    		}
    	}
    	for(int i=1;i<=MAX;++i)s[i]+=s[i-1];
    }
    int main()
    {
    	pre();
    	while(233)
    	{
    		int n=read();
    		if(!n)break;
    		int i=1,j;
    		long long ans=-1ll*n*(n+1)/2;
    		while(i<=n)
    		{
    			j=n/(n/i);
    			ans+=1ll*(n/i)*(n/i)*(s[j]-s[i-1]);
    			i=j+1;
    		}
    		printf("%lld
    ",ans/2);
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    checkbox radio select 选中总结
    vue-cli3总结
    数组总结
    Object 总结
    ajax总结
    canvas
    移动端事件
    微服务架构 SpringBoot(一)
    spring+activemq实战之配置监听多队列实现不同队列消息消费
    Integer 数值比较
  • 原文地址:https://www.cnblogs.com/cjyyb/p/8284639.html
Copyright © 2011-2022 走看看