BZOJ 2301: [HAOI2011]Problem b - 莫比乌斯反演
2016-01-27 12:22
411 查看
题目描述
经过这道题的洗礼后,现在这个题就是差不多的了。
注意容斥原理,向上向下取整的问题。=_=
经过这道题的洗礼后,现在这个题就是差不多的了。
注意容斥原理,向上向下取整的问题。=_=
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXN 50000 int mu[MAXN+10],prime[MAXN+10],cntpr,sum[MAXN+10],a,b,c,d,k; bool isprime[MAXN+10]; void CalMobius(int n) { memset(mu,0,sizeof mu); memset(isprime,0,sizeof isprime); cntpr=0; mu[1]=1; for(int i=2;i<=n;i++){ if(!isprime[i]){ prime[++cntpr]=i; mu[i]=-1; } for(int 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]; } } for(int i=1;i<=n;i++) sum[i]=mu[i]+sum[i-1]; } long long Cal(int n,int m) { long long ret=0; int side=min(n,m),last; for(int i=1;i<=side;i=last+1){ last=min(n/(n/i),m/(m/i)); ret+=1LL*(sum[last]-sum[i-1])*(n/i)*(m/i); } return ret; } int main() { int T; scanf("%d",&T); CalMobius(MAXN); while(T--){ scanf("%d%d%d%d%d",&a,&b,&c,&d,&k); b/=k,d/=k; a=(a-1)/k,c=(c-1)/k; long long ans=Cal(b,d)-Cal(a,d)-Cal(c,b)+Cal(a,c); printf("%I64d\n",ans); } }
相关文章推荐
- 基于jQuery 的图片瀑布流实现
- 关于 OneAPM Cloud Test DNS 监控的几个重要问题
- 图像的模糊处理原理
- Java的日期格式化常用方法
- AndroidApp启动优化篇
- 国外推广必备:国际知名APP网站&APP论坛列表
- 【资料夹】博文分享与汇总
- MAC book pro如何启动mongodb服务
- 网络请求类NSURLConnection的使用
- 关于 OneAPM Cloud Test DNS 监控的几个重要问题
- Swift_基本数据类型
- MySQL查询测试经验
- BeagleboneBack 从零开始系列之二(更换操作系统)
- iOS开发-修改TableViewCell的Delete按钮
- jquery实现可旋转可拖拽的文字效果代码
- hdu 2138(米勒—拉宾素数测试)
- 课堂笔记
- Valid Parentheses -- LeetCode
- JAVA基础笔记之Number类
- LeetCode 223 Rectangle Area(矩形面积)