bzoj2671: Calc
来源:互联网 发布:软件测试基础方法 编辑:程序博客网 时间:2024/04/29 18:02
链接
http://www.lydsy.com/JudgeOnline/problem.php?id=2671
题解
天啊噜!这道题好生麻烦
我尽量长话短说。
观察一下条件:
我们数论的算法都是和
即
因为
根据条件可以列出以下式子
将第三个式子左右同乘以
而
那么写出答案
这样的复杂度是稳定的
下面进入丧心病狂的部分,首先进行莫比乌斯反演:
注意这里的
这样比原来稍稍快一点,复杂度还是
丧病的优化,让我想了一整节晚自习,令
分块,复杂度变为
代码
//莫比乌斯反演 #include <cstdio>#include <algorithm>#include <cmath>#define maxn 50000#define ll long longusing namespace std;ll prime[maxn+10], mu[maxn+10], N, mark[maxn+10];void init(){ ll i, j; mu[1]=1; for(i=2;i<=maxn;i++) { if(!mark[i])prime[++prime[0]]=i,mu[i]=-1; for(j=1;j<=prime[0] and i*prime[j]<=maxn;j++) { mark[i*prime[j]]=1; if(i%prime[j]==0) { mu[i*prime[j]]=0; break; } mu[i*prime[j]]=-mu[i]; } }}void work(){ ll ans=0, d, t, sqrtn=sqrt(N), tmp, y, last, s; for(d=1;d*(d+1)<=N;d++) { tmp=0; for(y=2;y<=sqrtn/d;y++) { t=N/(d*d*y); for(s=1+y;s<=y+y-1 and s<=t;s=last+1) { last=t/(t/s); tmp+=(min(last,y+y-1)-s+1)*(t/s); } } ans+=tmp*mu[d]; } printf("%lld",ans);}int main(){ init(); scanf("%lld",&N); work(); return 0;}
0 0
- bzoj2671: Calc
- BZOJ2671: Calc
- bzoj2671: Calc
- bzoj2671 Calc 数论
- [BZOJ2671][莫比乌斯反演]Calc
- 【国家集训队2012】【BZOJ2671】Calc和与积
- [BZOJ2671] Calc和与积 - 容斥原理,莫比乌斯反演定理
- calc
- Calc
- calc()
- calc.exe
- 10calc
- Calc计算器
- calc常用
- 2506: calc
- 简易calc
- extremedb--calc
- 【BZOJ2506】calc
- Qt开发的小游戏-抗日
- 【Linux基础学习之五】Linux管理命令的基础学习(df、du、free、kill、tar等)
- html学习笔记(标签)
- Could not get lock /var/lib/dpkg/lock解决措施
- 自适应阵
- bzoj2671: Calc
- C/C++ Map 关于insert、iterator、erase、char * key总结
- UISprite和UITexture
- 亡羊补牢,为时未晚
- pair 对组
- 疯狂Java笔记:第 1 章 Java简介与开发环境的搭建
- 轻量却超强——推荐几款好用的截图工具
- 1540 银河英雄传说
- vector使用swap释放内存