[luogu3768] 简单的数学题 [杜教筛]
题面:
实际上就是求:

思路:
看到gcd就先反演一下,过程大概是这样:


明显的一步反演

这里设
,S(x)等于1到x的和
然后把枚举d再枚举T变成先枚举T再枚举其约数d,变形:

后面其中两项展开,把T提出来

S那里可以数论分块,那么只要S后面那个东西可以筛出来,就可以O(sqrt(n))

发现后面的那部分可以狄利克雷卷积一波

这明显是一个积性函数,但是n有10^10,所以不能线筛
考虑使用杜教筛,令上述函数为f,函数S为f的前缀和
套用杜教筛模板式

现在问题就是选一个合适的g函数了
我们知道欧拉函数有一个卷积性质:

那么我们令g(x)=x^2
此时g与f的卷积变成了:

看起来真是赏心悦目
于是杜教筛的递推式变成了这样的:

一波记忆化搜索带走AC
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
inline ll read(){
ll re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
ll n,MOD,inv2,inv6;
ll phi[],pri[],tot=;bool vis[];
void init(){
ll i,j,k;phi[]=;phi[]=;
for(i=;i<=;i++){
if(!vis[i]){
pri[++tot]=i;phi[i]=i-;
}
for(j=;j<=tot;j++){
k=i*pri[j];if(k>) break;
vis[k]=;
if(i%pri[j]==){
phi[k]=1ll*phi[i]*pri[j]%MOD;
break;
}
phi[k]=1ll*phi[i]*phi[pri[j]]%MOD;
}
}
for(i=;i<=;i++) phi[i]=(phi[i-]+1ll*i*i%MOD*phi[i]%MOD)%MOD;
}
ll sum1(ll x){x%=MOD;return x*(x+)%MOD*inv2%MOD;}
ll sum2(ll x){x%=MOD;return x*(x+)%MOD*((x<<)+)%MOD*inv6%MOD;}
map<ll,ll>m;
ll S(ll x){
if(x<=) return phi[x];
if(m[x]) return m[x];
ll re=sum1(x),tmp;re=re*re%MOD;ll i,j;
for(i=;i<=x;i=j+){
j=x/(x/i);
tmp=sum2(j)-sum2(i-);tmp=(tmp+MOD)%MOD;
re-=S(x/i)*tmp%MOD;re%=MOD;
}
return m[x]=(re+MOD)%MOD;
}
ll fpow(ll a,ll b){
ll re=;a%=MOD;
while(b){
if(b&) re=a*re%MOD;
b>>=;a=a*a%MOD;
}
return re;
}
int main(){
MOD=read();n=read();ll i,j;ll ans=,tmp,tt;
inv2=fpow(,MOD-);inv6=fpow(,MOD-);init();
for(i=;i<=n;i=j+){
j=n/(n/i);
tmp=sum1(n/i);
tmp=(tmp+MOD)%MOD;tmp=(tmp*tmp)%MOD;
tt=S(j)-S(i-);
tt=(tt+MOD)%MOD;
ans=(ans+tmp*tt%MOD)%MOD;
}
printf("%lld\n",(ans+MOD)%MOD);
}
[luogu3768] 简单的数学题 [杜教筛]的更多相关文章
- P3768 简单的数学题 杜教筛+推式子
\(\color{#0066ff}{ 题目描述 }\) 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数n和一个整数p,你需要求出(\(\sum_{i=1}^n\sum_{j=1}^n ij ...
- luogu P3768 简单的数学题 杜教筛 + 欧拉反演 + 逆元
求 $\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j)$ 考虑欧拉反演: $\sum_{d|n}\varphi(d)=n$ $\Rightarrow \sum_{i ...
- P3768 简单的数学题 [杜教筛,莫比乌斯反演]
\[\sum_{i=1}^{n}\sum_{j=1}^{n} ij\gcd(i,j)\] \[=\sum_{d=1}^{n} d \sum_{i=1}^{n}\sum_{j=1}^{n} ij[\gc ...
- 【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)
[Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\( ...
- 【luogu3768】简单的数学题 欧拉函数(欧拉反演)+杜教筛
题目描述 给出 $n$ 和 $p$ ,求 $(\sum\limits_{i=1}^n\sum\limits_{j=1}^nij\gcd(i,j))\mod p$ . $n\le 10^{10}$ . ...
- 「洛谷P3768」简单的数学题 莫比乌斯反演+杜教筛
题目链接 简单的数学题 题目描述 输入一个整数n和一个整数p,你需要求出 \[\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p\] ...
- 【Luogu】P3768简单的数学题(杜教筛)
题目链接 emm标题全称应该叫“莫比乌斯反演求出可狄利克雷卷积的公式然后卷积之后搞杜教筛” 然后成功地困扰了我两天qwq 我们从最基本的题意开始,一步步往下推 首先题面给出的公式是$\sum\limi ...
- loj#6229. 这是一道简单的数学题 (??反演+杜教筛)
题目链接 题意:给定\(n\le 10^9\),求:\(F(n)=\sum_{i=1}^n\sum_{j=1}^i\frac{\mathrm{lcm}(i,j)}{\mathrm{gcd}(i,j)} ...
- 洛谷P3768 简单的数学题 【莫比乌斯反演 + 杜教筛】
题目描述 求 \[\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} i*j*gcd(i,j) \pmod{p}\] \(n<=10^{10}\),\(p\) ...
随机推荐
- python_67_生成器3
import time def consumer(name): print("%s 准备吃包子啦!"%name) while True: baozi = yield print(& ...
- 题解 P1280 【尼克的任务】
传送门 f[i]表示i~n的最长空闲时间: 如果当前无任务就休息一秒(f[i]=f[i+1]+1): 否则f[i]=max(f[i],f[i+当前工作时间]); 用结构体来记录,我们对于每一个时刻开一 ...
- python查看安装包
D:\Python27\Scripts>pip listbackports.ssl-match-hostname (3.4.0.2)basicauth (0.2)certifi (14.5.14 ...
- java实现微信扫一扫详解
java实现微信扫一扫详解 一.微信JS-SDK参数配置及查找 JS安全域名配置(查找:微信公众号里-公众号设置-功能设置页) 注:1.安全域名外网必须可以访问的到 2.域名不能有下划线 3.要将 ...
- linux apache 不解析php文件显示源码
首先检查是否安装PHP 没有的话就先安装 如果安装过 在/etc/httpd/conf/httpd.conf文件中 在<IfModule mime_module>里面 AddType ap ...
- package.json字段分析
分析1.必须在包的顶层目录下2.二进制文件应该在bin目录下3.javascipt在lib目录下4.文档在doc目录下 package.json字段分析 name:包的名称,必须是唯一的,由小写英文字 ...
- 初识Java程序,编写简单代码?
Dear All: 初识Java程序,编写简单代码? 首先小编在这里说下我们今天编写Java程序使用的是 eclipse 开发工具! 1.下载eclipse 官网地址:http://www.eclip ...
- git 命令汇总
本地库处理 git init 初始化仓库 git clone [地址] 下载项目 git status 查看当前暂存等状态 git add 添加暂存 cat .git/config 查看git配置 l ...
- python列表中的赋值与深浅拷贝
首先创建一个列表 a=[[1,2,3],4,5,6] 一.赋值 a=[[1,2,3],4,5,6]b=aa[0][1]='tom'print(a)print(b)结果: [[1, 'tom', 3], ...
- javascript隐藏和显示元素以及清空textarea
当前希望写一个单选框,选中“paste”则显示粘贴框,选中“upload”则提示选择文件. 因为这两种情况只是显示不同,所以只需要用javascript来进行显示和隐藏. 最后的结果大概这样: 初始时 ...