【GDSOI 2016】互补约数
来源:互联网 发布:淘宝装修代码网站 编辑:程序博客网 时间:2024/04/29 11:12
Description
Solution
看到对于gcd的求和就知道是关于莫比乌斯繁衍的题目。
先来看一看要求什么:所有数分解成两个相乘的数的gcd,那么我们可以直接枚举那些相乘的数。
所以
和一般的莫比乌斯繁衍的长得很像,我们试着繁衍一下。
每次繁衍的最原始函数:
很显然的初始关系:
那么繁衍之后的关系就是:
我们来观察一下ans与f数组的关系,因为是求和就用出现次数(f[i])*数字(i)就可以了:
把繁衍式子代入:
一般式子里不允许一个数组里面有两个变量组成,我们用
这样考虑直接枚举T才方便做,明显发现
但是这样枚举的复杂度还是没有太大的变化,我们想原来繁衍那样观察一下g数组,g[i]是所有表示为(i*x,i*y)点对的gcd的和构成的,那么直接枚举x就可以算出y的个数:
因为
所以
带入ans里面:
很显然可以发现,当T大于
发现后面关于
fo(i,1,gen){ fo(j,1,gen/i)a[i*j]=a[i*j]+miu[i]*j; }
那么答案就变成:
我们设
那么只用分块来做后面就好了。
Code
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;typedef long long ll;const int maxn=1000007;ll i,j,k,l,t,n,m,ans,r;ll miu[maxn],a[maxn],p[maxn],gen;bool bz[maxn];int main(){ freopen("gcd.in","r",stdin); freopen("gcd.out","w",stdout); scanf("%lld",&n);miu[1]=1;gen=sqrt(n); fo(i,2,gen){ if(!bz[i]){p[++p[0]]=i,miu[i]=-1;} fo(j,1,p[0]){ t=p[j]*i;if(t>gen)break; bz[t]=1; if(!(i%p[j]))break; miu[t]=-miu[i]; } } fo(i,1,gen){ fo(j,1,gen/i)a[i*j]=a[i*j]+miu[i]*j; } fo(i,1,gen){ t=n/(i*i); k=0; for(l=1,r=0;l<=t;l=r+1){ r=t/(t/l); k+=(t/l)*(r-l+1); } ans=ans+a[i]*k; } printf("%lld\n",ans);}
1 0
- 【GDSOI 2016】互补约数
- 【GDSOI 2016】互补约数
- GDSOI 2016 T1 互补约数
- [JZOJ4496] 【GDSOI 2016】互补约数
- 【GDSOI 2016】第一题 互补约数
- GDOI2016 之 GDSOI 第一题 互补约数
- 【JZOJ 4496】【GDSOI 2016】第一题 互补约数 (两种解法)
- 互补约数(GCD)续
- 【GDOI2016】互补约数 题解
- GDSOI 2016 T2 星际穿越
- GDSOI模拟4.13总结
- GDOI&&GDSOI总结
- 互补滤波
- 互补滤波器
- 互补滤波器
- 互补滤波器
- 互补滤波
- 【GDSOI 2017】【JZOJ 5104】 逃亡
- amCharts在网页上绘制各种图形
- oracle 存储过程的基本语法
- IP数据报文的分片和组装
- 上架流程视图版(上架更新)
- 20160803 笔记之权限学习
- 【GDSOI 2016】互补约数
- HttpServlet容器响应Web客户请求流程
- SQL While
- POJ-1258 Agri-Net(并查集)
- poj1062
- 【R】三种数据索引获取方法
- 存储过程的优缺点
- hdoj2196Computer
- 数学