「VMware校园挑战赛」小V的和式
Description
给定 \(n,m\) ,求
\]
数据范围 \(1\le n,m\le 10^9\),答案对 \(998244353\) 取模。
Solution
约定
\(S_k(n)=\sum\limits_{i=1}^{n} i^k\)
若 \(n>m\) ,则交换 \(n,m\) ,保证 \(n\le m\)。
拆上下指标
先对上下指标做一下处理,得:
\]
\]
\]
考虑拆开 \([x_1<x_2][y_1<y_2]\) :
\]
\]
回带到原来式子,得到:
\(2[0\le x_1<x_2][0\le y_1<y_2]\)
\(-2([0=x_1<x_2][0\le y_1<y_2]+[0\le x_1<x_2][0=y_1<y_2])\)
\(+2[0=x_1<x_2][0=y_1<y_2]\)
\(+2[x_1>x_2][y_1<y_2]\)
\(+2([x_1<x_2][y_1=y_2]+[x_1=x_2][y_1<y_2])\)
\(+[x_1=x_2][y_1=y_2]\)
所以分别求出这 \(6\) 种情形即可,下面开始推导。
1. \([0\le x_1<x_2][0\le y_1<y_2]\)
即求
\]
\]
- 引理1
对于所有的 \(a \in [0,y), b\in[0,x)\),\((ax+by)\ mod\ (xy)\) 将集合 \(S=\{ (a,b) | 0\le a<y, 0\le b<x\}\) 映射到 \(T=\{ k\times gcd(a,b) | 0\le k< \frac{ab}{gcd(a,b)}\}\) ,并且对于 \(T\) 中的每一元素恰好有 \(gcd(a,b)\) 个原象。
感性理解一下即可,故:
\]
将前半部分拎出来:
\]
\]
\]
\]
其中 \(G_1(n)=n^3 \sum\limits_{d|n} \mu(d)d\)
因此
\]
2. \([0= x_1<x_2][0\le y_1<y_2]\)
即求
\]
\]
其实还有对称的 \([0\le x_1<x_2][0=y_1<y_2]\) ,推导类似。
3. \([0=x_1<x_2][0=y_1<y_2]\)
\]
4. \([x_1>x_2][y_1<y_2]\)
\]
\]
\]
\]
\]
\]
\]
其中 \(G_2(n)=n^2\sum\limits_{d|n}\mu(d)d\)
\(G_3(n)=n\sum\limits_{d|n}\mu(d)d\)
5. \([x_1=x_2][y_1<y_2]\)
\]
\]
可以发现 \(f_5\) 和 \(f_2\) 的式子完全一致,且符号相反,因此可以抵消。
显然对于另一半对称的式子也是如此。
6. \([x_1=x_2][y_1=y_2]\)
\]
合并
答案为
\]
\]
因此我们只需要快速求出 \(G_1(n),G_2(n),G_3(n)\) 的前缀和即可。
杜教筛
考虑杜教筛,以 \(G_1(n)\) 为例。
\(f(n)=n^3\sum\limits_{d|n}\mu(d)d\)
记 \(S(n)=\sum\limits_{i=1}^{n}f(i)\)
则 \(S(n)=\sum\limits_{i=1}^{n}i^3\sum\limits_{d|i}\mu(d)d\)
\(=\sum\limits_{d=1}^{n}\mu(d)d^4S_3(\lfloor \frac{n}{d}\rfloor)\)
所以我们需要杜教筛求 \(f'(i)=\mu(i)i^4\) 的前缀和。
考虑 \(g=ID^4\) ,则 \(h(n)=f'*g=[n==1]\)
故 \(S(n)=1-\sum\limits_{i=2}^{n}i^4 \times S(\lfloor \frac{n}{i}\rfloor)\)
实现
时间复杂度:\(O(n^{\frac{5}{6}})\)
空间复杂度:\(O(n^{\frac{2}{3}})\)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
using namespace std;
#define rint register int
#define rep(i,l,r) for(rint i=l;i<=r;i++)
#define per(i,l,r) for(rint i=l;i>=r;i--)
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pb push_back
#define fir first
#define sec second
#define mset(s,t) memset(s,t,sizeof(s))
template<typename T1,typename T2>void ckmin(T1 &a,T2 b){if(a>b)a=b;}
template<typename T1,typename T2>void ckmax(T1 &a,T2 b){if(a<b)a=b;}
template<typename T>T gcd(T a,T b){return b?gcd(b,a%b):a;}
int read(){
int x=0,f=0;
char ch=getchar();
while(!isdigit(ch))f|=ch=='-',ch=getchar();
while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
return f?-x:x;
}
const int N=10000005;
const int mod=998244353;
ll qpow(ll a,ll b=mod-2){
ll res=1;
a%=mod;
while(b>0){
if(b&1)res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
const ll inv2=qpow(2);
const ll inv4=qpow(4);
const ll inv6=qpow(6);
const ll inv8=qpow(8);
const ll inv30=qpow(30);
int mu[N],g1[N],g2[N],g3[N];
bool vis[N];
int pr[N>>3],len,L=1e7;
void init(int n){
mu[1]=1;
for(register int i=2;i<=n;i++){
if(!vis[i])pr[len++]=i,mu[i]=-1;
for(register int j=0;j<len&&pr[j]*i<=n;j++){
vis[pr[j]*i]=1;
if(i%pr[j]==0)break;
mu[pr[j]*i]=-mu[i];
}
}
rep(i,1,n){
g1[i]=(g1[i-1]+1ll*i*i%mod*i%mod*i%mod*mu[i])%mod;
g2[i]=(g2[i-1]+1ll*i*i%mod*i%mod*mu[i])%mod;
g3[i]=(g3[i-1]+1ll*i*i%mod*mu[i])%mod;
}
}
ll S1(ll x){
x%=mod;
return x*(x+1)%mod*inv2%mod;
}
ll S2(ll x){
x%=mod;
return x*(x+1)%mod*(2*x+1)%mod*inv6%mod;
}
ll S3(ll x){
x%=mod;
return S1(x)*S1(x)%mod;
}
ll S4(ll x){
x%=mod;
return x*(x+1)%mod*(2*x+1)%mod*(3*x*x%mod+3*x-1)%mod*inv30%mod;
}
int n,m;
unordered_map<int,ll>Map1,Map2,Map3;
ll GG1(int n){
if(n<=L)return g1[n];
if(Map1[n])return Map1[n];
ll ans=1;
for(int i=2,j;i<=n;i=j+1){
j=n/(n/i);
ans=(ans-GG1(n/i)*(S4(j)-S4(i-1)+mod))%mod;
}
return Map1[n]=(ans%mod+mod)%mod;
}
ll GG2(ll n){
if(n<=L)return g2[n];
if(Map2[n])return Map2[n];
ll ans=1;
for(int i=2,j;i<=n;i=j+1){
j=n/(n/i);
ans=(ans-GG2(n/i)*(S3(j)-S3(i-1)+mod))%mod;
}
return Map2[n]=(ans%mod+mod)%mod;
}
ll GG3(ll n){
if(n<=L)return g3[n];
if(Map3[n])return Map3[n];
ll ans=1;
for(int i=2,j;i<=n;i=j+1){
j=n/(n/i);
ans=(ans-GG3(n/i)*(S2(j)-S2(i-1)+mod))%mod;
}
return Map3[n]=(ans%mod+mod)%mod;
}
unordered_map<int,ll>map4,map5,map6;
ll G1(int n){
if(map4[n])return map4[n];
ll ans=0;
for(int i=1,j;i<=n;i=j+1){
j=n/(n/i);
ans=(ans+(GG1(j)-GG1(i-1)+mod)*S3(n/i))%mod;
}
return map4[n]=ans;
}
ll G2(int n){
if(map5[n])return map5[n];
ll ans=0;
for(int i=1,j;i<=n;i=j+1){
j=n/(n/i);
ans=(ans+(GG2(j)-GG2(i-1)+mod)*S2(n/i))%mod;
}
return map5[n]=ans;
}
ll G3(int n){
if(map6[n])return map6[n];
ll ans=0;
for(int i=1,j;i<=n;i=j+1){
j=n/(n/i);
ans=(ans+(GG3(j)-GG3(i-1)+mod)*S1(n/i))%mod;
}
return map6[n]=ans;
}
ll f1(){
ll ans=0;
for(int i=1,j;i<=n;i=j+1){
j=min(n/(n/i),m/(m/i));
ans=(ans+S2(n/i)*S2(m/i)%mod*(G1(j)-G1(i-1)+mod))%mod;
}
ans=ans*inv2%mod;
ans=(ans+mod-S1(n)*S1(m)%mod*inv2%mod)%mod;
return (ans+mod)%mod;
}
ll f4(){
ll ans=0;
for(int i=1,j;i<=n;i=j+1){
j=min(n/(n/i),m/(m/i));
ans=(ans+S2(n/i)*S2(m/i)%mod*(G1(j)-G1(i-1)+mod))%mod;
ans=(ans-(S1(n/i)*S2(m/i)+S2(n/i)*S1(m/i))%mod*(G2(j)-G2(i-1)+mod))%mod;
ans=(ans+S1(n/i)*S1(m/i)%mod*(G3(j)-G3(i-1)+mod))%mod;
}
ans=ans*inv4%mod;
return (ans+mod)%mod;
}
int main(){
init(L);
//n=1e9,m=1e9;
scanf("%d%d",&n,&m);
if(n>m)swap(n,m);
printf("%lld\n",2ll*(f1()+f4())%mod);
return 0;
}
关于对 \([0= x_1<x_2][0\le y_1<y_2]\) 的彩(推)蛋(导)
qwq 其实是因为我一开始没意料到能相互抵消,所以推了不少,这里就保留一下好了。
\]
\]
右边 \(y_2\) 的式子,令 \(t=m/dk\) ,经化简得
\]
因此:
\]
然后令 \(T=dk\) 化简一下就行了。。。
「VMware校园挑战赛」小V的和式的更多相关文章
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
- [LOJ#2323]「清华集训 2017」小Y和地铁
[LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...
- Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏
Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏 转载 来源:jrainlau 链接:https://segmentfault.com/a/1190000005804860 项 ...
- loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主
#2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 "A fight? Co ...
- [LOJ#2324]「清华集训 2017」小Y和二叉树
[LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...
- LOJ2324. 「清华集训 2017」小 Y 和二叉树【贪心】【DP】【思维】【好】
LINK 思路 首先贪新的思路是处理出以一个节点为根所有儿子的子树中中序遍历起始节点最小是多少 然后这个可以两次dfs来DP处理 然后就试图确定中序遍历的第一个节点 一定是siz<=2的编号最小 ...
- LOJ2324「清华集训 2017」小Y和二叉树
题目链接 瞎jb贪一发就过了.首先度数<=2且编号最小的点一定是中序遍历最靠前的点,我们从这个点开始dfs一遍算出子树中度数<=2且编号最小的点记为\(f(i)\),然后从这个点开始一步一 ...
- 【loj2325】「清华集训 2017」小Y和恐怖的奴隶主 概率dp+倍增+矩阵乘法
题目描述 你有一个m点生命值的奴隶主,奴隶主受伤未死且当前随从数目不超过k则再召唤一个m点生命值的奴隶主. T次询问,每次询问如果如果对面下出一个n点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输 ...
- 【费用流】loj#545. 「LibreOJ β Round #7」小埋与游乐场
好像现在看来这个缩点的思路挺清晰啊 题目描述 有两个非负整数组成的可重集合 $A$ 和 $B$. 现在你可以对 $A$ 中至多 $k$ 个元素进行操作.操作方法为:设你准备操作且未被操作过的 $A$ ...
随机推荐
- h5 ios输入框与键盘 兼容性优化
起因 h5的输入框引起键盘导致体验不好,目前就算微信.知乎.百度等产品也没有很好的技术方案实现,尤其底部固定位置的输入框各种方案都用的前提下体验也并没有很好,这个问题也是老大难问题了.目前在准备一套与 ...
- 用CSS实现Tab页切换效果
用CSS实现Tab切换效果 最近切一个页面的时候涉及到了一个tab切换的部分,因为不想用js想着能不能用纯CSS的选择器来实现切换效果.搜了一下大致有下面三种写法. 利用:hover选择器 缺点:只有 ...
- kafka生产者调优手册
目录 第一章 kafka硬件配置选择 1.1 场景说明 1.2 服务器台数选择 1.3 磁盘选择 1.4 内存选择(堆内存,页缓存) 1.4.1 堆内存配置 1.4.2 页缓存选择 1.5 cpu选择 ...
- 记-Golang日志文件读取及写入操作
Golang语言的 os 包中OpenFile 函数,如下所示: func OpenFile(name string, flag int, perm FileMode) (*File, error) ...
- 巧用 JuiceFS Sync 命令跨云迁移和同步数据
近年来,云计算已成为主流,企业从自身利益出发,或是不愿意被单一云服务商锁定,或是业务和数据冗余,或是出于成本优化考虑,会尝试将部分或者全部业务从线下机房迁移到云或者从一个云平台迁移到另一个云平台,业务 ...
- [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢?
[.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢? 在ASP.NET Core应用程序中,接 ...
- 原生实现C#和Lua相互调用-Unity3D可用
引言 本篇简单介绍如何在C#中执行Lua脚本,传递数据到Lua中使用,以及Lua中调用C#导出的方法等.在Unity中开发测试,并打IL2CPP的Android包在模拟器上运行通过.Lua版本 ...
- Web项目部署指南
Web项目部署指南 本文记录了部署Vue项目到阿里云服务器上的过程,其中云服务器的操作系统是CentOS 7,Web服务器用的是nginx.因为项目涉及发送异步请求,而由Flask编写的后端应用监听的 ...
- JS的URIencode方式
BEGIN; 对需要传递的URL参数进行URLencode编码 刚开始浪费了很多时间都没搞出来,不知道怎么用.后面google到了不少解决方案,最终解决.转载下面内容: js对文字进行编码涉及3个函数 ...
- 浅谈MatrixOne如何用Go语言设计与实现高性能哈希表
目录 MatrixOne数据库是什么? 哈希表数据结构基础 哈希表基本设计与对性能的影响 碰撞处理 链地址法 开放寻址法 Max load factor Growth factor 空闲桶探测方法 一 ...