BZOJ 2440 完全平方数-莫比乌斯函数
2016-01-26 19:56
489 查看
题目描述
1.n的不大确定+f(n)([1,n]中不是平方数的倍数的数的个数)递增 -> 二分
2.容斥原理:f(x)=1的倍数-一个质数的倍数+2个质数乘积的倍数-… ;
f(x)=sigma(mu[i]*floor(x/(i*i))) ,1<=i<=floor(sqrt(x))
1.n的不大确定+f(n)([1,n]中不是平方数的倍数的数的个数)递增 -> 二分
2.容斥原理:f(x)=1的倍数-一个质数的倍数+2个质数乘积的倍数-… ;
f(x)=sigma(mu[i]*floor(x/(i*i))) ,1<=i<=floor(sqrt(x))
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define MAXN 500000 #define INF 2000000000 typedef long long LL; LL mu[MAXN+10],prime[MAXN+10],cntpr,k; bool isprime[MAXN+10]; void CalMobius(LL n) { memset(mu,0,sizeof mu); memset(isprime,0,sizeof isprime); cntpr=0; mu[1]=1; for(LL i=2;i<=n;i++){ if(!isprime[i]){ prime[++cntpr]=i; mu[i]=-1; } for(LL j=1;prime[j]*i<=n&&j<=cntpr;j++){ isprime[prime[j]*i]=true; if(i%prime[j]==0){ mu[prime[j]*i]=0; break; } mu[prime[j]*i]=-mu[i]; } } } LL Quary(LL x) { LL side=sqrt(x+0.5),ret=0; for(LL i=1;i<=side;i++) ret+=mu[i]*(x/(i*i)); //也不要加floor装逼了,这个也会导致TLE return ret; } void partition() { LL l=1,r=INF,mid,ans; while(l<r){ mid=(l+r)/2; if(Quary(mid)>=k){ r=mid; ans=mid; } else l=mid+1; } printf("%lld\n",ans); } int main() { LL T; scanf("%lld",&T); CalMobius(MAXN); //注意MAXN不要开大了,虽然是线性筛,但就是这个害得我TLE while(T--){ scanf("%lld",&k); partition(); } }
相关文章推荐
- 高斯模糊算法浅析-----------微信朋友圈的红包照片有感而发
- OC学习中的一些知识点(自用)
- java中int,float,long,double取值范围,内存泄露
- Bugtags 那些事儿
- 如何使用Navicat恢复数据库脚本
- HDU 3065 病毒侵袭持续中 AC自动机
- unix环境高级编程之信号篇(二)
- quickcocos2d-x BMFont自定义字体 fnt使用 以及工具地址下载
- 回调方法介绍之中国好室友篇(Java示例)
- 找出微信把你删除的好友
- Runtime中property_getName与property_getAttributes
- 对照地图看历史剧,学习历史地理
- MyBatis使用@MapKey注解接收多个查询记录到Map中,以便方便地用get()方法获取字段的值
- Android layout_weight layout_width ,Listview单行特定textview省略
- java类的生命周期分析
- HBase-7.hbase查询多版本数据&过滤器原则&批量导入Hbase&hbase预分区
- hdu 5583 Kingdom of Black and White
- android EditText多行文本输入的若干问题
- 事件和进程间的数据交换
- 如何使用Navicat备份数据库脚本