首先有一个等式是$\varphi(ab)=\frac{\varphi(a)\varphi(b)d}{\varphi(d)}$,其中$d=(a,b)$,这个比较好证,直接按展开式计算可得$\varphi(ab)\varphi(d)=\varphi(a)\varphi(b)d$(等号两边$d$的质因子都出现了两次)

然后推式子,得到$\sum\limits_{T=1}^nf(T)g\left(\left\lfloor\frac nT\right\rfloor,T\right)g\left(\left\lfloor\frac mT\right\rfloor,T\right)$,其中$f(n)=\sum\limits_{d|n}\mu\left(\frac nd\right)\frac d{\varphi(d)},g(n,k)=\sum\limits_{i=1}^n\varphi(ik)$

$f$可以枚举$d$更新倍数预处理,关键在于快速求$g$

我们先对每个$k$预处理$g\left(1\cdots\left\lfloor\frac nk\right\rfloor,k\right)$,这是$O(n\log n)$的

用分段的思想,设一个阈值$C$,对于$\leq\frac nC$的$T$用预处理好的$g$暴力求值,若$T\gt\frac nC$,这时$\left\lfloor\frac nT\right\rfloor\leq C$,我们再预处理$h_{i,j,k}=f(k)\sum\limits_{t=1}^i\varphi(tk)\sum\limits_{t=1}^j\varphi(tk)$,用$h$还有根号分段算剩下的部分

#include<stdio.h>
typedef long long ll;
const int mod=998244353,T=100000,C=30;
void swap(int&a,int&b){a^=b^=a^=b;}
int min(int a,int b){return a<b?a:b;}
int mul(int a,int b){return a*(ll)b%mod;}
int ad(int a,int b){return(a+b)%mod;}
int de(int a,int b){return(a-b)%mod;}
void inc(int&a,int b){(a+=b)%=mod;}
int pow(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=mul(s,a);
		a=mul(a,a);
		b>>=1;
	}
	return s;
}
int pr[T+10],phi[T+10],mu[T+10];
bool np[T+10];
void sieve(){
	int i,j,M=0;
	phi[1]=1;
	mu[1]=1;
	for(i=2;i<=T;i++){
		if(!np[i]){
			pr[++M]=i;
			phi[i]=i-1;
			mu[i]=-1;
		}
		for(j=1;j<=M&&i*pr[j]<=T;j++){
			np[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);
			mu[i*pr[j]]=-mu[i];
		}
	}
}
int f[T+10],*g[T+10],*h[40][40];
int get(int n,int m){
	if(n>m)swap(n,m);
	int i,nex,s;
	s=0;
	for(i=1;i<=min(T/C,n);i++)inc(s,mul(f[i],mul(g[i][n/i],g[i][m/i])));
	for(;i<=n;i=nex+1){
		nex=min(n/(n/i),m/(m/i));
		inc(s,de(h[n/i][m/i][nex-T/C],h[n/i][m/i][i-1-T/C]));
	}
	return ad(s,mod);
}
int main(){
	sieve();
	int i,j,k,t,x,y,cas,n,m;
	for(i=1;i<=T;i++){
		t=mul(i,pow(phi[i],mod-2));
		for(j=i;j<=T;j+=i)inc(f[j],mul(mu[j/i],t));
	}
	for(j=1;j<=T;j++){
		g[j]=new int[T/j+1];
		g[j][0]=0;
		for(i=1;i<=T/j;i++)g[j][i]=ad(g[j][i-1],phi[i*j]);
	}
	for(i=1;i<=C;i++){
		for(j=1;j<=C;j++){
			h[i][j]=new int[min(T/i,T/j)-T/C+2];
			h[i][j][0]=0;
		}
	}
	for(k=T/C+1;k<=T;k++){
		x=0;
		t=k-T/C;
		for(i=1;i<=T/k;i++){
			inc(x,phi[i*k]);
			y=0;
			for(j=1;j<=T/k;j++){
				inc(y,phi[j*k]);
				h[i][j][t]=ad(h[i][j][t-1],mul(mul(x,y),f[k]));
			}
		}
	}
	scanf("%d",&cas);
	while(cas--){
		scanf("%d%d",&n,&m);
		printf("%d\n",get(n,m));
	}
}

[LOJ6179]Pyh的求和的更多相关文章

  1. 【loj6179】Pyh的求和

    Portal -->loj6179 Solution ​  这题其实有一个式子一喵一样的版本在bzoj,但是那题是\(m\)特别大然后只有一组数据  这题多组数据== ​    首先根据\(\v ...

  2. loj #6179. Pyh 的求和 莫比乌斯反演

    题目描述 传送门 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m \varphi(ij)(mod\ 998244353)\) \(T\) 组询问 \(1 \leq ...

  3. Java程序:从命令行接收多个数字,求和并输出结果

    一.设计思想:由于命令行接收的是字符串类型,因此应先将字符串类型转化为整型或其他字符型,然后利用for循环求和并输出结果 二.程序流程图: 三.源程序代码:   //王荣荣 2016/9/23     ...

  4. Java之递归求和的两张方法

    方法一: package com.smbea.demo; public class Student { private int sum = 0; /** * 递归求和 * @param num */ ...

  5. EXCEL中对1个单元格中多个数字求和

    如A1=3779.3759.3769.3781.3750,A2对A1中4个数字求和怎么求!请高手赐教! 方法一:在B1中输入公式=SUM(MID(A1,{1,6,11,16,21},4)*1) 方法二 ...

  6. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  7. 从sum()求和引发的思考

    sum()求和是一个非常简单的函数,以前我的写法是这样,我想大部分和我一样刚开始学习JS的同学写出来的也会是这样. function sum() { var total=null; for(var i ...

  8. //给定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; ]={,- ...

  9. Ajax中get请求和post请求

    我们在使用Ajax向服务器发送数据时,可以采用Get方式请求服务器,也可以使用Post方式请求服务器,那么什么时候该采用Get方式,什么时候该采用Post方式呢? Get请求和Post请求的区别: 1 ...

随机推荐

  1. js_!和!!的使用

    js中有些特殊的数据(“” 0 null undefined NaN),请求后台返回的数据中往往都有一些这样的数据,需要对这些数据进行过滤. 过滤代码 var a = 0;//0 "&quo ...

  2. 启动Eclipse时,弹出failed to load the jni shared library

    JDK版本和Eclipse版本不同的问题,JDK版本为64位,Eclipse版本为32位.

  3. ms17-010 攻击win7漏洞复现

    只是为了好玩重新写一篇.利用还是很简单的. 将下载下来的rb放置在:/usr/share/metasploit-framework/modules/exploits/windows/smb/ 目录下 ...

  4. HDU 6188 Duizi and Shunzi 贪心

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6188 题意:给了n个数,然后现在问我们最多构成多少个对子和顺子,其中对子是2个相同的牌,顺子是3个连续 ...

  5. VM虚拟机,Linux系统安装tools过程遇到 what is the location of the “ifconfig” program

    安装步骤: 复制到/mnt 解压文件 tar -zxvf VMwareTools-10.1.6-5214329.tar.gz 进入减压文件夹后安装 ./vmware-install.pl ... 一直 ...

  6. 神奇JavaScript框架---Top5

    前言 个人观点,供您参考 观点源自作者的使用经验和日常研究 排名基于框架的受欢迎度, 语法结构, 易用性等特性 希望大家能够基于此视频找到最适合自己的框架 下面介绍的都是严格的前端框架和库 前言 To ...

  7. python插入oracle数据

    # coding=utf- ''''' Created on -- @author: ''' import json; import urllib2 import sys import cx_Orac ...

  8. MAC Pro 2017款 无线上网慢

    MAC Pro 2017款 在无线路由器和MAC相隔一个房间,上网很慢,怀疑是无线路由器有问题,但其他几台老款MAC和PC上网正常.后来将蓝牙关掉,上网就很快了.

  9. Convert Sorted List to Binary Search Tree&&Convert Sorted Array to Binary Search Tree——暴力解法

    Convert Sorted List to Binary Search Tree Given a singly linked list where elements are sorted in as ...

  10. mac 远程桌面连接分享

    mac 远程桌面连接分享 8.0版本 https://pan.baidu.com/s/1wgVvAmQreGwYZAhLST764w 10.0版本 https://pan.baidu.com/s/1Y ...