[LOJ6179]Pyh的求和
首先有一个等式是$\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的求和的更多相关文章
- 【loj6179】Pyh的求和
Portal -->loj6179 Solution 这题其实有一个式子一喵一样的版本在bzoj,但是那题是\(m\)特别大然后只有一组数据 这题多组数据== 首先根据\(\v ...
- 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 ...
随机推荐
- 微信小程序提示框
一.wx.showToast 如上图所示,showToast会显示一个弹窗,在指定的时间之后消失.中间的图标默认只有加载中和成功两种,也可以用image参数自定义图标 wx.showToast({ t ...
- github: Permission denied (publickey). 问题解决方法
部署服务器过程中想clone自己github中的库,结果出现Permission denied (publickey).的错误,解决方法是添加服务器公钥到github的settings->SSH ...
- mac10.9下安装Android
这里记录一下mac下安装android比较快捷的方法 首先,到这里下载Android SDK,这个是集成的,所有工具一应俱全,免去了下载一堆东西的烦恼.具体包括如下: Eclipse + ADT pl ...
- iOS 真机调试报错汇总
1. iphone is busy: processing symbol files 引起原因第一次运行真机, 会处理一些文件, 上面会有一个进度条给予显示 等100%之后再编译 2. xcode c ...
- HTML5API(4)
十三.服务器推送 服务器主动向客户端推送信息 传统的HTTP协议传输,服务器是被动相应客户端的请求 1.解决方案 ajax轮询.ajax长轮询 Server-Send-Event WebSocket ...
- 初识ES6
1.ECMAScript的官网地址:http://www.ecma-international.org/cma-262/6.0/,其是JS语言的下一代标准,已经在2015年6月正式发布,目标是让JS可 ...
- 算法入门系列1:k-means
k-means是一种无监督学习算法,用于聚类. 下图(来自http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006910.html)展示了k-m ...
- linux命令(48):nl命令
nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...
- POJ 1456 Supermarket(贪心+并查集)
题目链接:http://poj.org/problem?id=1456 题目大意:有n件商品,每件商品都有它的价值和截止售卖日期(超过这个日期就不能再卖了).卖一件商品消耗一个单位时间,售卖顺序是可以 ...
- http之post方法 提交数据的四种方法
http协议中,post方法用来向服务端提交数据, 这里介绍四种方式: application/x-www-form-urlencoded multipart/form-data applicatio ...