P4240 毒瘤之神的考验

题目背景

\(\tt{Salamander}\)的家门口是一条长长的公路。

又是一年春天将至,\(\tt{Salamander}\)发现路边长出了一排毒瘤!

\(\tt{Salamander}\)想带一些毒瘤回家,但是,这时毒瘤当中钻出来了一个毒瘤之神!

毒瘤之神:你想要带毒瘤走吗?想要带走毒瘤,就必须回答我的问题!如果答不出来的话,你还是乖乖回家吧!

题目描述

毒瘤之神会问\(T\)次,每次给定\(n\),\(m\),\(\tt{Salamander}\)需要回答出\(\sum_{i=1}^n\sum_{j=1}^m\varphi(ij) \bmod 998244353\)。

\(\tt{Salamander}\)这么辣鸡当然不会做啦,于是把问题丢给了你。

输入输出格式

输入格式:

第一行包含一个正整数\(T\)。

接下来\(T\)行,每行包含两个正整数,用空格隔开,表示这次询问的\(n\),\(m\)。

输出格式:

包含\(T\)行每行一个整数表示答案。

说明

对于\(40\%\)的数据,\(T=1,n,m\leq 10^5\);

对于\(50\%\)的数据,\(T\leq 1000,n,m\leq 10^5\);

对于另外\(10\%\)的数据,\(T\leq 10000,n=m\leq 10^5\);

对于\(100\%\)的数据,\(T\leq 10^4,n,m\leq 10^5\)。


辣鸡\(\tt{Dew}\)又双叒叕做了20年这个题...

经验:

  • \[\varphi(ij)=\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}
    \]

  • 1e5的多组数据,千万别嫌吝啬预处理的复杂度,\(\log\ln\)什么的随便往上扔

推式子一波得到

\[\sum_{T=1}^{\min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}\varphi(iT)\sum_{j=1}^{\lfloor\frac{m}{T}\rfloor}\varphi(jT)\sum_{k|T}\frac{k}{\varphi(k)}\mu(\frac{T}{k})
\]

发现万恶之源了吗,\(\varphi\)上面的\(T\)...

先不管那么多,把式子简化一下。

\[\mathbf G(i,j)=\sum_{k=1}^j\varphi(ki),\mathbf f(i)=\sum_{k|i}\frac{k}{\varphi(k)}\mu(\frac{i}{k})
\]

注意\(\bf G\)的可用值只有\(n\ln n\)个,所以可用简单的拿\(vector\)存一下,\(\bf f\)直接\(n\sqrt n\)做就好了。

式子变成了

\[\sum_{T=1}^{\min(n,m)}\mathbf G(T,\lfloor\frac{n}{T}\rfloor)\mathbf G(T,\lfloor\frac{m}{T}\rfloor)\mathbf f(T)
\]

多组询问的话,我们可以对询问进行分块。

预处理

\[\mathbf T(k,i,j)=\sum_{i=1}^k\mathbf G(k,i)\mathbf G(k,j)\mathbf f(k)
\]

注意这个数组同样要使用\(vector\)存一下不可能使用的值,否则就爆了。

考虑后两维预处理到\(U\),那么预处理的复杂度可以简单的认为是\(O(U^2n)\)的。

在询问的时候,根据\(\lfloor\frac{n}{T}\rfloor\)或者\(\lfloor\frac{m}{T}\rfloor\)与\(U\)的大小关系判断一下。

具体的,若\(\min(\lfloor\frac{n}{T}\rfloor,\lfloor\frac{m}{T}\rfloor)\le U\),直接用前缀和\(\bf T\)做个差,复杂度最坏是\(O(\sqrt n)\)的

否则直接暴力,复杂度是\(O(\frac{n}{U})\)的

总复杂度是\(O(T(\sqrt n+\frac{n}{U})+n\ln n+n\sqrt n+nU^2)\)的

然后取个\(U=T^{\frac{1}{3}}\)大一点差不多最优了


Code:

#include <cstdio>
#include <vector>
#define ll long long
const ll N=1e5;
const ll U=30;
const ll mod=998244353;
ll pri[N+10],ispri[N+10],mu[N+10],phi[N+10],phiinv[N+10],f[N+10],cnt;
std::vector <ll> G[N+10],T[U+1][U+1];
ll quickpow(ll d,ll k)
{
ll f=1;
while(k)
{
if(k&1) f=f*d%mod;
d=d*d%mod;
k>>=1;
}
return f;
}
void init()
{
mu[1]=phi[1]=1;
for(ll i=2;i<=N;i++)
{
if(!ispri[i])
{
pri[++cnt]=i;
mu[i]=-1;
phi[i]=i-1;
}
for(ll j=1;j<=cnt&&i*pri[j]<=N;j++)
{
ispri[i*pri[j]]=1;
if(i%pri[j]==0)
{ phi[i*pri[j]]=phi[i]*pri[j];
break;
}
else
{
mu[i*pri[j]]=-mu[i];
phi[i*pri[j]]=phi[i]*(pri[j]-1);
}
}
}
for(ll i=1;i<=N;i++)
phiinv[i]=quickpow(phi[i],mod-2);
for(ll i=1;i<=N;i++)
{
ll j;
for(j=1;j*j<i;j++)
{
if(i%j==0)
{
(f[i]+=j*phiinv[j]%mod*mu[i/j])%=mod;
(f[i]+=i/j*phiinv[i/j]%mod*mu[j])%=mod;
}
}
if(j*j==i) (f[i]+=j*phiinv[j]%mod*mu[j])%=mod;
}
for(ll i=1;i<=N;i++)
{
G[i].push_back(0);
for(ll j=1;j*i<=N;j++)
G[i].push_back((G[i][j-1]+phi[i*j])%mod);
}
for(ll i=1;i<=U;i++)
{
for(ll j=1;j<=U;j++)
{
T[i][j].push_back(0);
for(ll k=1;k*i<=N;k++)
T[i][j].push_back((T[i][j][k-1]+f[k]*G[k][i]%mod*G[k][j])%mod);
}
}
}
ll min(ll x,ll y){return x<y?x:y;}
ll max(ll x,ll y){return x>y?x:y;}
int main()
{
init();
ll t,n,m;scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld",&n,&m);ll ans=0;
for(ll l=1,r;l<=min(n,m);l=r+1)
{
r=min(n/(n/l),m/(m/l));
if(max(n/l,m/l)<=U) (ans+=T[n/l][m/l][r]-T[n/l][m/l][l-1])%=mod;
else
{
for(ll i=l;i<=r;i++)
(ans+=G[i][n/l]*G[i][m/l]%mod*f[i])%=mod;
}
}
printf("%lld\n",(ans+mod)%mod);
}
return 0;
}

2018.11.26

洛谷 P4240 毒瘤之神的考验 解题报告的更多相关文章

  1. 洛谷 P4240 - 毒瘤之神的考验(数论+复杂度平衡)

    洛谷题面传送门 先扯些别的. 2021 年 7 月的某一天,我和 ycx 对话: tzc:你做过哪些名字里带"毒瘤"的题目,我做过一道名副其实的毒瘤题就叫毒瘤,是个虚树+dp yc ...

  2. 洛谷P4240 毒瘤之神的考验 【莫比乌斯反演 + 分块打表】

    题目链接 洛谷P4240 题解 式子不难推,分块打表真的没想到 首先考虑如何拆开\(\varphi(ij)\) 考虑公式 \[\varphi(ij) = ij\prod\limits_{p | ij} ...

  3. P4240 毒瘤之神的考验

    题目 P4240 毒瘤之神的考验 神仙题\(emmm\) 前置 首先有一个很神奇的性质: \(\varphi(ij)=\dfrac{\varphi(i)\varphi(j)gcd(i,j)}{\var ...

  4. 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur 解题报告

    P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 约翰有\(n\)块草场,编号1到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可 ...

  5. 【洛谷】CYJian的水题大赛 解题报告

    点此进入比赛 \(T1\):八百标兵奔北坡 这应该是一道较水的送分题吧. 理论上来说,正解应该是DP.但是,.前缀和优化暴力就能过. 放上我比赛时打的暴力代码吧(\(hl666\)大佬说这种做法的均摊 ...

  6. 从 [P4240 毒瘤之神的考验] 谈 OI 中的美学

    感觉这题真的特别有意思,涉及了 OI 中很多非常有意思.非常美的手法,比如--平衡两部分的时间复杂度.\(n \ln n\) 的那个 Trick等等,真的一种暴力的美学. 题目大意: 多组询问,求 \ ...

  7. 【洛谷】NOIP2018原创模拟赛DAY1解题报告

    点此进入比赛 T1:小凯的数字 题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果 很显然,这是道考验数(运)学(气)的题目 结论:输出\((l+r)*(r-l+1)\over ...

  8. 洛谷 P2498 [SDOI2012]拯救小云公主 解题报告

    P2498 [SDOI2012]拯救小云公主 题目描述 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到\(boss\)的洞穴门口,他一下子就懵了,因为面前不只是一 ...

  9. 洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 解题报告

    P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题目描述 Bessie the cow, always a fan of shiny objects, has ta ...

随机推荐

  1. jenkins自动打包部署linux

    需要用到2个插件. git parameter:用于参数化构建时选择分支. Publish Over SSH:用于上传jar包和操作tomcat 1.先在系统设置添加要连接的linux服务器,使用用户 ...

  2. TensorFlow深度学习实战---循环神经网络

    循环神经网络(recurrent neural network,RNN)-------------------------重要结构(长短时记忆网络( long short-term memory,LS ...

  3. 180724-统计JVM进程中线程数两种方式小记

    I. 统计进程中的线程数 相关系列博文推荐: 180711-JVM定位分析CPU性能消耗 180704-JDK常用监控参数 jvm调优的工具介绍 1. proc查询 /proc 目录以可读文本文件形式 ...

  4. 关于SQL 语句常用的一些查询收藏

    create database xuesheng go use xuesheng go /*学生表*/ create table Student ( S# ,) primary key, Sname ...

  5. How to pass an Amazon account review

    Have you ever sold products on Amazon? How about sold so much within the first week that amazon deci ...

  6. Python3 函数式编程自带函数

    一 map函数 引子 需求1:num1=[1,2,3,4],我的需求是把num1中的每个元素平方后组成新列表. ret = [] num1 = [1,2,3,4] for i in num1: ret ...

  7. LCA(Tarjan算法)模板

    一.查询一组的LCA Nearest Common Ancestors A rooted tree is a well-known data structure in computer science ...

  8. Python 变量和常量及数据类型

    一.变量的命名 变量由字母.数字和下划线组成.变量的第1个字符必须是字母或下划线. 二.变量的赋值 例: x = 1 三.局部变量 局部变量只能在函数或者代码段内使用. 四.全局变量 在函数之外定义的 ...

  9. Codeforces Beta Round #14 (Div. 2) D. Two Paths 树的直径

    题目链接: http://codeforces.com/contest/14/problem/D D. Two Paths time limit per test2 secondsmemory lim ...

  10. 处理了一个以前写的java小程序的异常

    之前用java做过0-99的数字和英文之间的翻译,输入数字就会翻译成英文,输入英文会翻译成数字,比如输入56  输出fiftysix   输入fiftysix  输出56, 发现这会有一个异常,当输入 ...