【loj6179】Pyh的求和
Solution
这题其实有一个式子一喵一样的版本在bzoj,但是那题是\(m\)特别大然后只有一组数据
这题多组数据==
首先根据\(\varphi(x)\)的通项\(\varphi(x)=x\prod\limits_{i=1}^{n}(1-\frac{1}{p1_i})=\prod\limits_{i=1}^{m}(p_i-1)p_i^{a_i-1}\)(其中\(n\)是\(x\)分解质因数之后没有去重的质因数列表\(p1\)的长度,\(m\)是去重之后质因数列表\(p\)的长度,\(x=\prod\limits_{i=1}^{m} p_i^{a_i}\))我们有\(\varphi(i*j)=\varphi(i)*\varphi(j)*\frac{gcd(i,j)}{\varphi(gcd(i,j))}\),具体就是因为\(\varphi(i)*\varphi(j)\)中\(gcd\)的质因子的部分被算了两次,但是除掉\(\varphi(gcd(i,j))\)之后又没有将\(gcd\)对\(a_i\)的贡献算上
然后我们就可以快乐推式子了,为了让接下来的式子更加简洁,我们默认\(n<=m\):
&\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\varphi(ij)\\
=&\sum\limits_{i=1}^n \sum\limits_{j=1}^m \varphi(i)\varphi(j)\frac{gcd(i,j)}{\varphi(gcd(i,j))}\\
=&\sum\limits_{d=1}^n\sum\limits_{i=1}^n\sum\limits_{j=1}^m\varphi(i)\varphi(j)\frac{d}{\varphi(d)}[gcd(i,j)=d]\\
=&\sum\limits_{d=1}^n\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}\varphi(id)\varphi(jd)\frac{d}{\varphi(d)}[gcd(i,j)=1]\\
=&\sum\limits_{d=1}^n\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}\varphi(id)\varphi(jd)\frac{d}{\varphi(d)}\sum\limits_{k|i,k|j}\mu(k)\\
=&\sum\limits_{d=1}^n\frac{d}{\varphi(d)}\sum\limits_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)\sum\limits_{i=1}^{\lfloor\frac{n}{dk}\rfloor}\varphi(idk)\sum\limits_{j=1}^{\lfloor\frac{m}{dk}\rfloor}\varphi(jdk)\\
=&\sum\limits_{T=1}^n\sum\limits_{k|T}\mu(\frac{T}{k})\frac{k}{\varphi(k)}\sum\limits_{i=1}^{\lfloor\frac{n}{T}\rfloor}\varphi(iT)\sum\limits_{j=1}^{\lfloor\frac{m}{T}\rfloor}\varphi(jT)\\
\end{aligned}
\]
稍微说一下最后一步是相当于枚举\(dk\),也就是令\(T=dk\)然后枚举\(T\)
然后我们可以令\(g(x)=\sum\limits_{k|x}\mu(\frac{x}{k})\frac{k}{\varphi(k)}\),令\(s(i,j)=\sum\limits_{k=1}^j\varphi(ik)\)
那么这个式子就可以写成:
\]
接下来看起来是怎么化也化不动了qwq但是我们发现\(g(i)\)和\(s(i,j)\)都可以在调和级数的复杂度内预处理出来,但是再接下来我们发现\(O(n)\)求解显然是不现实的
这时候当然是要大力分段啊,只不过光是普通的操作还是不行(前缀和这个东西很难搞),这里我们还需要一个黑科技,我们手动设定一个阈值\(TOP\),然后对于\(i<=\frac{m}{TOP}\)的情况我们暴力算,对于\(i>\frac{m}{TOP}\)的情况,我们再预处理一个\(T[i][j][k]\)(也就是前缀和):
T[i][j][k]&=\sum\limits_{p=1}^kg(p)\sum\limits_{t=1}^i\varphi(tp)\sum\limits_{t=1}^i\varphi(tp)\\
&=\sum\limits_{p=1}^kg(p)\cdot s(p,i)\cdot s(p,j)
\end{aligned}
\]
然后当\(i>\frac{m}{TOP}\)的时候\(\lfloor\frac{m}{i}\rfloor<=TOP\),所以我们\(i,j\)只要预处理到\(TOP\)然后直接用普通的分段操作来搞就好了
代码大概长这个样子
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int N=1e5+10,MOD=998244353,TOP=35,inf=2147483647;
int p[N],g[N],miu[N],phi[N],inv[N];
vector<int>S[N];//s[i][j]=\sum_{k=1}^{j}phi[i*k]
vector<int> T[TOP+1][TOP+1];//T[i][j][k]=\sum_{p=1}^{k}\sum_{t=1}^{i}phi(t*p)\sum_{t=1}^{j}phi(t*p)
int vis[N];
int n,m,ans,T1;
void prework(int n){
int cnt=0;
miu[1]=1; phi[1]=1;
for (int i=2;i<=n;++i){
if (!vis[i])
miu[i]=-1,p[++cnt]=i,phi[i]=i-1;
for (int j=1;j<=cnt&&i*p[j]<=n;++j){
vis[i*p[j]]=true;
if (i%p[j]==0){
miu[i*p[j]]=0; phi[i*p[j]]=phi[i]*p[j];
break;
}
else
miu[i*p[j]]=-miu[i],phi[i*p[j]]=phi[i]*phi[p[j]];
}
}
inv[1]=1;
for (int i=2;i<=n;++i) inv[i]=1LL*(MOD-MOD/i)*inv[MOD%i]%MOD;
for (int i=1;i<=n;++i)
for (int j=i;j<=n;j+=i){
if (j==9)
int debug=1;
g[j]=(1LL*g[j]+1LL*miu[j/i]*(1LL*(i)*inv[phi[i]]%MOD)+MOD)%MOD;
}
for (int i=1;i<=n;++i){
S[i].push_back(0);
for (int j=1;j<=n/i;++j) S[i].push_back((S[i][j-1]+phi[i*j])%MOD);
}
for (int i=1;i<=TOP;++i)
for (int j=1;j<=TOP;++j){
T[i][j].push_back(0);
for (int k=1;k<=n/i&&k<=n/j;++k)
T[i][j].push_back((1LL*T[i][j][k-1]+1LL*g[k]*S[k][i]%MOD*S[k][j]%MOD)%MOD);
}
}
void solve(){
if (n>m) swap(n,m);
ans=0;
for (int i=1;i<=m/TOP;++i)
ans=(1LL*ans+1LL*g[i]*S[i][n/i]%MOD*S[i][m/i]%MOD)%MOD;
for (int i=m/TOP+1,pos=0;i<=n;i=pos+1){
pos=min(m/(m/i),(n/i)?n/(n/i):inf);
ans=(1LL*ans+(1LL*T[n/i][m/i][pos]+MOD-T[n/i][m/i][i-1])%MOD)%MOD;
}
printf("%lld\n",ans);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
prework(N-10);
//prework(10);
scanf("%d",&T1);
for (int o=1;o<=T1;++o){
scanf("%d%d",&n,&m);
solve();
}
}
【loj6179】Pyh的求和的更多相关文章
- [LOJ6179]Pyh的求和
首先有一个等式是$\varphi(ab)=\frac{\varphi(a)\varphi(b)d}{\varphi(d)}$,其中$d=(a,b)$,这个比较好证,直接按展开式计算可得$\varphi ...
- loj #6179. Pyh 的求和 莫比乌斯反演
题目描述 传送门 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m \varphi(ij)(mod\ 998244353)\) \(T\) 组询问 \(1 \leq ...
- Java程序:从命令行接收多个数字,求和并输出结果
一.设计思想:由于命令行接收的是字符串类型,因此应先将字符串类型转化为整型或其他字符型,然后利用for循环求和并输出结果 二.程序流程图: 三.源程序代码: //王荣荣 2016/9/23 ...
- Java之递归求和的两张方法
方法一: package com.smbea.demo; public class Student { private int sum = 0; /** * 递归求和 * @param num */ ...
- EXCEL中对1个单元格中多个数字求和
如A1=3779.3759.3769.3781.3750,A2对A1中4个数字求和怎么求!请高手赐教! 方法一:在B1中输入公式=SUM(MID(A1,{1,6,11,16,21},4)*1) 方法二 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- 从sum()求和引发的思考
sum()求和是一个非常简单的函数,以前我的写法是这样,我想大部分和我一样刚开始学习JS的同学写出来的也会是这样. function sum() { var total=null; for(var i ...
- //给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和
//给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和 # include<stdio.h> void main() { ,sum1; ]={,- ...
- Ajax中get请求和post请求
我们在使用Ajax向服务器发送数据时,可以采用Get方式请求服务器,也可以使用Post方式请求服务器,那么什么时候该采用Get方式,什么时候该采用Post方式呢? Get请求和Post请求的区别: 1 ...
随机推荐
- VMWARE网络配置内网与外网互ping
新增网络适配器 设置自定义VMnet0 自动桥接 NAT的网络要配置网关 我们在CentOS中打开ifcfg-ens33文件(每个系统文件名都不同,但都是以ifcfg-ens33开头的文件),进行修改 ...
- Qt creator 最常用的13个快捷键
alt +enter // 自动创建类的定义 F1 // 查看帮助,文档 F2 // 快速到变量声明 Shift + F2 // 函数的声明和定义之间快速切换 F4 // 在 cpp 和 h 文件切换 ...
- Gradle初使用
我以前一直使用Maven来构建工程,这两天突然发现gradle也非常好用,记录一下自己使用gradle的过程. Gradle的下载与配置 本次选择下载的是gradle3.5版本,没选最新的gradle ...
- python3 ,AttributeError: module 'tensorflow' has no attribute 'merge_summary'
error:tensorflow有些方法属性被改了, self.summary_writer = tf.train.SummaryWriter(summary_dir)改为:summary.FileW ...
- 兰亭集势股价疯涨背后:物流成外贸B2C发展掣肘
21世纪经济报道 汤浔芳 北京报道 核心提示:“兰亭集势涨势喜人,这样的增长是这两三年中概股没有出现过的.”一位负责美股投资的基金合伙人告诉记者,此前,中概股比较低迷,持续大幅度上涨,难得一见. 在唯 ...
- python正则表达式re之compile函数解析
re正则表达式模块还包括一些有用的操作正则表达式的函数.下面主要介绍compile函数. 定义: compile(pattern[,flags] ) 根据包含正则表达式的字符串创建模式对象. 通过py ...
- 最全的NB-IoT芯片厂商、模组厂商信息
NB-IoT作为LPWAN(低功耗广域网)的新兴技术,因为具有低功耗.低成本.广覆盖.海量节点等优势,并且在授权频段可以与2G.3G无缝连接而被运营商所青睐且接受.特别是到了2017年,据统计全球有5 ...
- 关于双系统下Ubuntu不能访问Windows中某个盘的问题
1.问题描述 在Ubuntu系统下访问Windows系统中磁盘时出现无法访问的情况,具体如下显示: 该问题为磁盘挂载错误,需要进行修复. 2.解决办法 (1)打开终端:如果没有安装ntfs ...
- TCP系列42—拥塞控制—5、Linux中的慢启动和拥塞避免(二)
在本篇中我们继续上一篇文章wireshark的示例讲解,上一篇介绍了一个综合示例后,本篇介绍一些简单的示例,在读本篇前建议先把上一篇读完,为了节省篇幅,本篇只针对一些特殊的场景点报文进行讲解,不会像上 ...
- jQuery之_元素滚动
对应的知识点铺垫,但是有一个很重要的问题就是兼容IE和chorme的 1. scrollTop(): 读取/设置滚动条的Y坐标2. $(document.body).scrollTop()+$(doc ...