【LOJ6052】「雅礼集训 2017 Day11」DIV(杜教筛)
大致题意: 求\(1\sim n\)内所有满足\(a>0\)的\(n\)的复数约数\(a+bi\)的\(a\)之和。
解题思路
首先,我们设\(x=(a+bi)(c+di)(1\le x\le n)\),则:
\]
由于\(x\)是一个实数,因此:
\]
而由\(②\)式可得:
\]
设\(\frac ab=\frac pq(gcd(p,q)=1)\),则\(\frac cd=-\frac pq\),而原式就变成了:
\]
然后可以发现\(p+qi\)与\(p-qi\)似乎可以利用平方差公式化简,即:
\]
也就是说,只要\(p^2+q^2\)是\(x\)的约数,它就可以对答案造成贡献。
而造成的的贡献值是多少呢?
考虑每一个既为\(p^2+q^2\)的倍数,又为\(x\)的约数的数,都可以对答案造成贡献。
则设一个造成贡献的数为\(w(p^2+q^2)\)。
由于\(w(p^2+q^2)\)是\(x\)的约数,所以\(w\)是\(\frac x{p^2+q^2}\)的约数。
因此,\(p^2+q^2\)对答案造成的总贡献为:
\]
如果我们将\(p\)提前,则可以发现剩下的部分恰好是一个\(\sigma\)(约数和)函数,即:
\]
那么枚举所有\(p,q\)可得总答案为:
\]
考虑枚举\(p^2+q^2=y\),则原式就相当于:
\]
由于\(\sum_{y|x}\sigma(\frac xy)\)其实就是\(\sum_{i=1}^{\lfloor\frac ny\rfloor}\sigma(i)\),因此若我们设\(D(i)=\sum_{k=1}^i\sigma(k)\),并设\(f(i)=\sum_{gcd(p,q)=1\&\&p^2+q^2=i}p\),则原式就可以转化为:
\]
看到\(D(\lfloor\frac ny\rfloor)\),便可以想到用除法分块去搞。
设\(F(i)=\sum_{k=1}^if(i)\),那么,我们现在的问题就是,如何快速求\(F\)和\(D\)的值。
如何求\(F\)
对于\(F\),考虑杜教筛。
设\(G(n)=\sum_{p^2+q^2\le n}p=\sum_{p=1}^{\lfloor\sqrt n\rfloor}p\cdot\lfloor\sqrt{n-p^2}\rfloor\),枚举\(gcd(p,q)\),可得:
\]
然后就用杜教筛的经典转化套路,单独提出\(d=1\),得到:
\]
移项,得到式子为:
\]
由于\(G(n)\)可以通过\(O(\sqrt n)\)的时间计算出,然后我们除法分块递归求解\(F\)即可。
如何求\(D\)
\(hl666\)神仙说,他以前切过一道题就是求这道题里的\(D\)。
根据他的结论,我们得知:
\]
这应该还是比较好懂的,就是枚举约数暴力算个数。
依然除法分块,\(O(\sqrt n)\)的时间复杂度内可以计算出。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define RL Reg LL
#define Con const
#define CI Con int&
#define CL Con LL&
#define I inline
#define W while
#define LL long long
#define X 1004535809
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
#define Dec(x,y) ((x-=(y))<0&&(x+=X))
using namespace std;
LL n;
I int gcd(CI x,CI y) {return y?gcd(y,x%y):x;}
I int XSum(CI x,CI y) {return x+y>=X?x+y-X:x+y;}
I int XSub(CI x,CI y) {return x-y<0?x-y+X:x-y;}
class DuSieve//杜教筛,虽然不该把求D也放在这里面。。。
{
private:
#define S 4641588
static Con int I2=X+1>>1;int Pc,P[S+5],d[S+5],f[S+5],D[S+5],F[S+5];
public:
I DuSieve()//初始化,线性筛出一部分D值,并求出一部分F值
{
RI i,j,k;for(d[1]=1,i=2;i<=S;++i)
for(!P[i]&&(d[P[++Pc]=i]=i+1),j=1;j<=Pc&&i*P[j]<=S;++j)
if(P[i*P[j]]=1,i%P[j]) d[i*P[j]]=1LL*d[i]*(P[j]+1)%X;
else {d[i*P[j]]=XSub(1LL*d[i]*(P[j]+1)%X,1LL*d[i/P[j]]*P[j]%X);break;}
for(i=1;i*i<=S;++i) for(k=i*i,j=1;k+j*j<=S;++j) gcd(i,j)==1&&Inc(f[k+j*j],i);
for(i=1;i<=S;++i) Inc(d[i],d[i-1]),Inc(f[i],f[i-1]);//统计前缀和
}
I int GetF(CL x)//求F
{
if(x<=S) return f[x];if(F[n/x]) return F[n/x];RI i,res=0;//对于小数据或已经求结果的部分直接返回答案
for(i=1;1LL*i*i<=x;++i) Inc(res,(LL)floor(sqrt(x-1LL*i*i))*i%X);//求G值和
for(i=2;1LL*i*i<=x;++i) Dec(res,1LL*GetF(x/(1LL*i*i))*i%X);return F[n/x]=res;//递归计算F
}
#define sum(x,y) (1LL*((x+y)%X)*((y-x+1)%X)%X*I2%X)
I int GetD(CL x)//求D
{
if(x<=S) return d[x];if(D[n/x]) return D[n/x];RL l,r;RI res=0;//对于小数据或已经求结果的部分直接返回答案
for(l=1;l<=x;l=r+1) r=x/(x/l),Inc(res,1LL*(x/r)%X*sum(l,r)%X);return D[n/x]=res;//除法分块
}
}D;
int main()
{
RL l,r,ans=0;for(scanf("%lld",&n),l=1;l<=n;l=r+1)//除法分块
r=n/(n/l),Inc(ans,1LL*XSub(D.GetF(r),D.GetF(l-1))*D.GetD(n/l)%X);//统计答案
return printf("%lld",XSum(XSum(ans,ans),D.GetD(n))),0;//输出答案
}
【LOJ6052】「雅礼集训 2017 Day11」DIV(杜教筛)的更多相关文章
- LOJ #6052. 「雅礼集训 2017 Day11」DIV
完了我是数学姿势越来越弱了,感觉这种CXRdalao秒掉的题我都要做好久 一些前置推导 首先我们很容易得出\((a+bi)(c+di)=k \Leftrightarrow ac-bd=k,ad+bc= ...
- LOJ #6051. 「雅礼集训 2017 Day11」PATH
完了感觉最近留了好多坑的说,这题也是模模糊糊地会一点 首先我们发现题目要求的是单调不上升的序列个数,那么一个套路就是用值减去下标 然后考虑连续位置的限制,这个我们做一个置换然后尽量向后取 这样拿值和位 ...
- LOJ #6050. 「雅礼集训 2017 Day11」TRI
完全不会的数学神题,正解留着以后填坑 将一个口胡的部分分做法,我们考虑计算格点多边形(包括三角形)面积的皮克公式: \[S=a+\frac{1}{2}b-1\text({a为图形内部节点个数,b为边界 ...
- loj 6051 「雅礼集训 2017 Day11」PATH - 多项式 - 钩子公式
题目传送门 传送门 设 $m = \sum_{i = 1}^{n} a_i$. 总方案数显然等于 $\frac{m!}{\prod_{i = 1}^{n} a_i!}$. 考虑这样一个网格图,第 $i ...
- LOJ_6045_「雅礼集训 2017 Day8」价 _最小割
LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...
- 「雅礼集训 2017 Day7」事情的相似度
「雅礼集训 2017 Day7」事情的相似度 题目链接 我们先将字符串建后缀自动机.然后对于两个前缀\([1,i]\),\([1,j]\),他们的最长公共后缀长度就是他们在\(fail\)树上对应节点 ...
- 「雅礼集训 2017 Day2」解题报告
「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...
- 「雅礼集训 2017 Day1」 解题报告
「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...
- [LOJ 6031]「雅礼集训 2017 Day1」字符串
[LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...
随机推荐
- Redis启动和关闭
带配置文件启动 ./redis-server redis.conf 关闭 无密码模式 ./redis-cli -h xxx -p xxx shutdown 密码模式 ./redis-cli -h ...
- 使用selenium时碰到的某一个坑
如图:
- IE67不兼容display:inline-block,CSS hack解决
追加以下代码:*display:inline.*zoom:1 ;} 块元素变为内联块, IE67不兼容:内联元素变为内联块,所有浏览器都支持 发现问题:当然,变为内联块后,有一个特性就是如果元素换行, ...
- vim脚本语言
转自:http://man.chinaunix.net/newsoft/vi/doc/usr_41.html#usr_41.txt Vim 脚本语言在很多地方用到,包括 vimrc 文件, 语法文件, ...
- tomcat-dbcp数据库连接池配置以及使用时候的一些坑
一.数据库连接池 开发的时候经常会需要对数据库进行一些操作,比如说常见的增删改查之类的,当数据量小的时候,可以直接进行操作,但是当数据量增多的时候,每一次连接以及释放数据库都会耗费一定的时间,这个时候 ...
- 9、搜索 :ion-searchbar
/* ---html----*/ <ion-searchbar [(ngModel)]="searchQuery" (input)="getItems($event ...
- CentOS初使用命令总结
最近买了一台aliyun(ECS服务器)用来学习使用,初次使用难免要走弯路.遇到一些问题好长时间解决不了,结果经人指点豁然开朗.于是乎,总结了一些新生上路经验. 首先要解决的问题是:通过PuTTY.S ...
- Ajax简单介绍和使用步骤
Ajax被认为是(Asynchronous(异步) JavaScript And Xml的缩写).现在,允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做Ajax. 同步是指:发送方发出数据后,等 ...
- Trim a Binary Search Tree
Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so that a ...
- Java使用UDP聊天程序
主要想测试Java UDP通信.Java UDP使用DatagramSocket和DatagramPacket完成UDP通信 主要思路: 1.本机通信,ip地址为:127.0.0.1 2.开一个线程监 ...