[JZOJ4496] 【GDSOI 2016】互补约数
来源:互联网 发布:网络英文翻译兼职 编辑:程序博客网 时间:2024/04/30 14:06
Description
求
Solution
LF同志说过一句话。
“看到GCD,我们就要坚信它能够反演!”
原式显然可以化。
然后就是套路
设
根据g的定义(f那个式子中
可得
因为
所以
交换主体
显然,你可以分块再预处理一些东西,把g代进去即可
然而,此处有一个性质
证明懒得打了,具体参见大牛LYD729的BLOG
然后
g带进去
然后分块可以在很优的复杂度跑出来
Code
#include <cstdio>#include <cstdlib>#include <algorithm>#include <iostream>#include <cstring>#include <cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)#define N 320000#define LL long long using namespace std;LL pr[N],phi[N],sum[N],n;int m,l;bool bz[N];void prp(){ l=0; phi[1]=sum[1]=1; fo(i,2,m) { if(!bz[i]) pr[++l]=i,phi[i]=i-1; for(int j=1;j<=l&&pr[j]*i<=m;j++) { bz[i*pr[j]]=1; if(i%pr[j]==0) { phi[i*pr[j]]=phi[i]*pr[j]; break; } phi[i*pr[j]]=phi[i]*(pr[j]-1); } sum[i]=sum[i-1]+phi[i]; }}int main(){ cin>>n; m=sqrt(n); prp(); LL T=1,s=0; while(T<=m) { LL x=1,lim=n/T/T,s1=0; LL T1=sqrt(n/lim); while(x<=lim) { LL x1=lim/(lim/x); s1+=(x1-x+1)*(lim/x); x=x1+1; } s+=(sum[T1]-sum[T-1])*s1; T=T1+1; } cout<<s;}
0 0
- [JZOJ4496] 【GDSOI 2016】互补约数
- 【GDSOI 2016】互补约数
- 【GDSOI 2016】互补约数
- GDSOI 2016 T1 互补约数
- 【GDSOI 2016】第一题 互补约数
- GDOI2016 之 GDSOI 第一题 互补约数
- 【JZOJ 4496】【GDSOI 2016】第一题 互补约数 (两种解法)
- 互补约数(GCD)续
- 【GDOI2016】互补约数 题解
- GDSOI 2016 T2 星际穿越
- GDSOI模拟4.13总结
- GDOI&&GDSOI总结
- 互补滤波
- 互补滤波器
- 互补滤波器
- 互补滤波器
- 互补滤波
- 【GDSOI 2017】【JZOJ 5104】 逃亡
- JAVA基础知识--BigDecimal类
- Zend Framework 2 学习教程链接
- 学习CDN!
- LeetCode 148. Sort List
- LeetCode 160. Intersection of Two Linked Lists
- [JZOJ4496] 【GDSOI 2016】互补约数
- char,short ,int ,long,long long,unsigned long long数据范围
- LeetCode 19. Remove Nth Node From End of List
- android获得屏幕高度和宽度
- 关于新浪微博开放平台第三方登录接口问题
- Android中的Touch事件处理
- LeetCode 2. Add Two Numbers
- 书法的艺术
- 画图板