洛谷 P4240 毒瘤之神的考验 解题报告
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\)什么的随便往上扔
推式子一波得到
\]
发现万恶之源了吗,\(\varphi\)上面的\(T\)...
先不管那么多,把式子简化一下。
\]
注意\(\bf G\)的可用值只有\(n\ln n\)个,所以可用简单的拿\(vector\)存一下,\(\bf f\)直接\(n\sqrt n\)做就好了。
式子变成了
\]
多组询问的话,我们可以对询问进行分块。
预处理
\]
注意这个数组同样要使用\(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 毒瘤之神的考验 解题报告的更多相关文章
- 洛谷 P4240 - 毒瘤之神的考验(数论+复杂度平衡)
洛谷题面传送门 先扯些别的. 2021 年 7 月的某一天,我和 ycx 对话: tzc:你做过哪些名字里带"毒瘤"的题目,我做过一道名副其实的毒瘤题就叫毒瘤,是个虚树+dp yc ...
- 洛谷P4240 毒瘤之神的考验 【莫比乌斯反演 + 分块打表】
题目链接 洛谷P4240 题解 式子不难推,分块打表真的没想到 首先考虑如何拆开\(\varphi(ij)\) 考虑公式 \[\varphi(ij) = ij\prod\limits_{p | ij} ...
- P4240 毒瘤之神的考验
题目 P4240 毒瘤之神的考验 神仙题\(emmm\) 前置 首先有一个很神奇的性质: \(\varphi(ij)=\dfrac{\varphi(i)\varphi(j)gcd(i,j)}{\var ...
- 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur 解题报告
P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 约翰有\(n\)块草场,编号1到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可 ...
- 【洛谷】CYJian的水题大赛 解题报告
点此进入比赛 \(T1\):八百标兵奔北坡 这应该是一道较水的送分题吧. 理论上来说,正解应该是DP.但是,.前缀和优化暴力就能过. 放上我比赛时打的暴力代码吧(\(hl666\)大佬说这种做法的均摊 ...
- 从 [P4240 毒瘤之神的考验] 谈 OI 中的美学
感觉这题真的特别有意思,涉及了 OI 中很多非常有意思.非常美的手法,比如--平衡两部分的时间复杂度.\(n \ln n\) 的那个 Trick等等,真的一种暴力的美学. 题目大意: 多组询问,求 \ ...
- 【洛谷】NOIP2018原创模拟赛DAY1解题报告
点此进入比赛 T1:小凯的数字 题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果 很显然,这是道考验数(运)学(气)的题目 结论:输出\((l+r)*(r-l+1)\over ...
- 洛谷 P2498 [SDOI2012]拯救小云公主 解题报告
P2498 [SDOI2012]拯救小云公主 题目描述 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到\(boss\)的洞穴门口,他一下子就懵了,因为面前不只是一 ...
- 洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 解题报告
P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题目描述 Bessie the cow, always a fan of shiny objects, has ta ...
随机推荐
- Android开发笔记——以Volley图片加载、缓存、请求及展示为例理解Volley架构设计
Volley是由Google开源的.用于Android平台上的网络通信库.Volley通过优化Android的网络请求流程,形成了以Request-RequestQueue-Response为主线的网 ...
- JS继承方法
1.原型链: 每个构造函数都有一个原型对象,且有一个指针指向该原型对象(prototype),原型对象都包含一个指向构造函数的指针(constructor),而实例都包含一个指向原型对象的内部指针(p ...
- uvaoj 156Ananagrams(map和vector组合使用)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- selenium +java 多个类公用driver问题
问题点:太久没有写selenium代码,居然把driver公用的问题忘记了,即:每写一个测试类,执行过程中都会新建一个窗口,这样应该说是非常不专业的. 大概想了一个方法,虽然看起来也不怎么专业,但感觉 ...
- sql server 按月对数据表进行分区
当某张数据表数据量较大时,我们就需要对该表进行分区处理,以下sql语句,会将数据表按月份,分为12个分区表存储数据,废话不多说,直接上脚本: use [SIT_L_TMS] --开启 XP_CMDSH ...
- 【python 3.6】使用itertools.product进行排列组合
#python 3.6 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'BH8ANK' import itertools colo ...
- mtv网站架构模式适合企业网站应用吗?
mtv网站架构模式适合企业网站应用吗?有时候在思考这样一个问题. 从开发角度来说,本来mvc的进度慢了些,如果在数据库管理方面用sql的话,管理起来也不很方便.小企业网本来数据就不很多,也没什么太多安 ...
- 如何理解IPD+CMMI+Scrum一体化研发管理解决方案之Scrum篇
如何快速响应市场的变化,如何推出更有竞争力的产品,如何在竞争中脱颖而出,是国内研发企业普遍面临的核心问题,为了解决这些问题,越来越多的企业开始重视创新与研发管理,加强研发过程的规范化,集成产品开发(I ...
- c# 调用c++dll二次总结
1.pinvoke结构不对称,添加语句(网上有) 2.含回调函数,成员参数的结构体必须完全,尽管自己用不到. 3.加深对c++指针的理解.一般情况下,类型加*等效于c++中的ref.但对于short* ...
- c# 消息机制
1.windows系统是一个消息驱动的系统,windows本身有自己的消息队列. 系统传递消息给应用程序. 应用程序的消息机制:应用程序的执行是通过消息驱动的.消息是整个应用程序的工作引擎. 2.c# ...