• [中山市选2011] 完全平方数


    题面

        大概是比较基础的反演了,设 f(n) 为前n个数有多少个不是xxx,g(n)=n,则:

        g(n) = ∑ f(n/i^2),大概就是枚举 1~n中每个数的最大平方因子是多少了(注意极大也对,因为这里极大因子=最大因子)。

        我们反演一下,可以得到 f(n) = ∑ μ(i) * g(n/i^2),(这只是莫比乌斯反演的其中一种形式),我可以来提示一下怎么推这个式子。

        我们把  ∑ μ(i) * g(n/i^2) 中的所有g()用 g(n) = ∑ f(n/j^2) 展开,然后原式= ∑μ(i) * ∑ f(n/(i^2 * j^2)),我们把求和号交换,并让 i*j = d,可以得到原式= ∑f(n/d) * ∑μ(p) * [p|d]。

        众所周知 e(x) = ∑ μ(y) * [y|x]  = [x=1] (这个不管你用二项式定理还是数论函数卷积都可以证啦),所以原式 = f(n) 得证。

    然后这个题 f(n) 可以在 O(sqrt(n)) 的复杂度下求出之后就是个傻题了2333

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=1e6;
    
    int zs[N/10+5],t,miu[N+5],T,n;
    bool v[N+5];
    
    inline void init(){
    	miu[1]=1;
    	for(int i=2;i<=N;i++){
    		if(!v[i]) zs[++t]=i,miu[i]=-1;
    		
    		for(int j=1,u;j<=t&&(u=zs[j]*i)<=N;j++){
    			v[u]=1;
    			if(!(i%zs[j])) break;
    			miu[u]=-miu[i];
    		}
    	}
    }
    
    inline ll Get(ll x){
    	ll an=0,now=1;
    	for(int i=1;now<=x;now+=(ll)(2*i+1),i++) an+=miu[i]*(ll)(x/now);
    	return an; 
    }
    
    int main(){
    	init();
    	
    	scanf("%d",&T);
    	
    	while(T--){
    		scanf("%d",&n);
    		
        	ll l=1,r=1644934081,mid,ans=0;
        	while(l<=r){
        		mid=l+r>>1;
        		if(Get(mid)>=n) ans=mid,r=mid-1;
        		else l=mid+1;
        	}	
    	
        	printf("%lld
    ",ans);
        }
    	return 0;
    }
    

      

  • 相关阅读:
    Java反射
    安装python
    查看网页加载速度,并优化
    模型按一个圈摆放(10等分)
    y = n*x 匀速,变速运动
    物体绕圆形做圆周运动
    three.js 相机跟随鼠标移动
    three.js 物体随鼠标移动
    three.js 画正多边形-线性
    ES6的JavaScript数据结构实现之队列
  • 原文地址:https://www.cnblogs.com/JYYHH/p/11320205.html
Copyright © 2020-2023  润新知