zoukankan      html  css  js  c++  java
  • [中山市选2011][bzoj2440] 完全平方数 [二分+莫比乌斯容斥]

    题面

    传送门

    思路

    新姿势get

    莫比乌斯容斥

    $sum_{i=1}{n}mu(i)f(i)$

    这个东西可以把所有没有平方质因子的东西表示出来,还能容斥掉重复的项

    证明是根据莫比乌斯函数的定义,显然

    于是本题里面,我们二分答案$K$,那么闭区间$[1,K]$中的没有平方质因子的数的个数就是$sum_{i=1}{sqrt{K}}mu(i)frac{K}{i2}$

    然后线性筛一波,单次询问复杂度$O(log_2maxnsqrt{K})$,$maxn$是二分上界

    Code:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cassert>
    #include<cmath>
    #define ll long long
    using namespace std;
    inline int read(){
    	int re=0,flag=1;char ch=getchar();
    	while(ch>'9'||ch<'0'){
    		if(ch=='-') flag=-1;
    		ch=getchar();
    	}
    	while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
    	return re*flag;
    }
    ll mu[100010],pri[100010],cntp,vis[100010];
    void init(){
    	ll i,j,k,len=100000;mu[1]=1;
    	for(i=2;i<=len;i++){
    		if(!vis[i]) pri[++cntp]=i,mu[i]=-1;
    		for(j=1;j<=cntp;j++){
    			k=i*pri[j];if(k>len) break;
    			vis[k]=1;
    			if(i%pri[j]==0){mu[k]=0;break;}
    			mu[k]=-mu[i];
    		}
    	}
    } 
    ll cntsqr(ll lim){
    	ll i,len=sqrt(lim);ll re=0;
    	for(i=1;i<=len;i++) re+=mu[i]*(lim/(i*i));
    	return re;
    }
    int main(){
    	int T=read();ll n,l,r,mid;
    	init();
    	while(T--){
    		n=read();
    		l=1;r=10000000000;
    		while(l<r){
    			mid=(l+r)>>1;
    			if(cntsqr(mid)>=n) r=mid;
    			else l=mid+1;
    		}
    		printf("%lld
    ",l);
    	}
    }
    
  • 相关阅读:
    mysql 获取字符串的长度
    mysql 字符类以及重复元字符
    mysql 字段拼接
    mysql 去除字符串中的空格
    mysql 正则表达式
    mysql 选出前五个元素
    mysql regexp 表达式
    mysql 选择所有同学名字
    mysql 获取数学成绩最高以及最低的同学
    mysql 获取单个科目的平均分
  • 原文地址:https://www.cnblogs.com/dedicatus545/p/9437212.html
Copyright © 2011-2022 走看看