Description

Link.

给定一个数列 \(\sf a_1,a_2,....a_n\),请求出下面这个结果在模 \(\sf 998244353\) 下的答案。

\[\sum_{i=1}^{n}\sum_{j=1}^{n}2^{a_i a_j}
\]

Solution

这题涉及一个 trick:\(\sf ij=\binom{i+j}{2}-\binom{i}{2}-\binom{j}{2}\),是 UQ 里面 EI 给我讲的,说明一下。

首先我们令 \(\sf c_{a_{i}}=the~number~of~the~occurrences~of~a_{i},mx=\max\{a_{i}\}\)。

然后来推式子:

\[\begin{aligned}
\sf\sum_{i=1}^{n}\sum_{j=1}^{n}2^{a_{i}a_{j}}&=\sf\sum_{i=1}^{mx}\sum_{j=1}^{mx}c_{i}c_{j}2^{ij} \\
&=\sf\sum_{i=1}^{mx}\sum_{j=1}^{mx}c_{i}c_{j}2^{\binom{i+j}{2}-\binom{i}{2}-\binom{j}{2}} \\
&=\sf\sum_{i=1}^{mx}\sum_{j=1}^{mx}c_{i}c_{j}2^{\binom{i+j}{2}}2^{-\binom{i}{2}}2^{-\binom{j}{2}} \\
&=\sf\sum_{i=1}^{mx}\sum_{j=1}^{mx}c_{i}c_{j}2^{\binom{i+j}{2}}2^{-\binom{i}{2}}2^{-\binom{j}{2}} \\
\end{aligned}\\
\]

现在我们令 \(\sf t_{i}=2^{\binom{i}{2}},it_{i}=2^{-\binom{i}{2}}\)。

那么 \(\sf i+j\) 那项你就直接拿出来最后单独算即可。

\[\begin{aligned}
\sf\sum_{i=1}^{n}\sum_{j=1}^{n}2^{a_{i}a_{j}}
&=\sf\sum_{i=1}^{mx}\sum_{j=1}^{mx}c_{i}c_{j}2^{\binom{i+j}{2}}2^{-\binom{i}{2}}2^{-\binom{j}{2}} \\
&=\sf\sum_{i=1}^{mx}\sum_{j=1}^{mx}c_{i}c_{j}t_{i+j}it_{i}it_{j} \\
\end{aligned}\\
\]

最后直接算:

\[\sf \sum_{i=1}^{mx}\sum_{j=0}^{mx-1}c_{i}it_{i}c_{i-j}it_{i-j}
\]

卷积 完了。

记住模数非质的时候不一定有逆元啊啊啊啊!!!!

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MOD=998244353;
void exGCD(LL one,LL ano,LL &x,LL &y)
{
if(ano==0) x=1,y=0;
else exGCD(ano,one%ano,y,x),y-=(one/ano)*x;
}
LL getInv(LL val,LL _MOD){LL res,w; exGCD(val,_MOD,res,w); return (res%_MOD+_MOD)%_MOD;}
LL fspow(LL bas,LL fur)
{
LL res=1;
while(fur)
{
if(fur&1) res=LL(res)*bas%MOD;
bas=LL(bas)*bas%MOD;
fur>>=1;
}
return (res+MOD)%MOD;
}
LL fac[200010],ifac[200010];
//LL binom(LL n,LL k){return n>=k?LL(fac[n])*ifac[k]%(MOD-1)*ifac[n-k]%(MOD-1):0;}
LL binom(LL n,LL k){return n>=k?LL(n)*(n-1)/2%(MOD-1):0;}
namespace Poly
{
typedef vector<LL> poly;
#define len(x) (LL((x).size()))
LL lim,rev[800010];
void ntt(poly &f,LL op)
{
for(LL i=0;i<lim;++i) if(i<rev[i]) swap(f[i],f[rev[i]]);
for(LL len=2;len<=lim;len<<=1)
{
LL bas=fspow(op==1?3:332748118,(MOD-1)/len);
for(LL fr=0;fr<lim;fr+=len)
{
LL now=1;
for(LL ba=fr;ba<fr+(len>>1);++ba,now=LL(now)*bas%MOD)
{
LL tmp=LL(now)*f[ba+(len>>1)]%MOD;
f[ba+(len>>1)]=(f[ba]-tmp+MOD)%MOD;
f[ba]=(f[ba]+tmp)%MOD;
}
}
}
if(op==-1)
{
LL tmp=getInv(lim,MOD);
for(LL i=0;i<lim;++i) f[i]=LL(f[i])*tmp%MOD;
}
}
poly operator*(poly f,poly g)
{
LL n=len(f)+len(g)-1; lim=1;
while(lim<n) lim<<=1;
f.resize(lim),g.resize(lim);
for(LL i=0;i<lim;++i) rev[i]=(rev[i>>1]>>1)|((i&1)?(lim>>1):0);
ntt(f,1),ntt(g,1);
for(LL i=0;i<lim;++i) f[i]=LL(f[i])*g[i]%MOD;
ntt(f,-1),f.resize(n);
return f;
}
}using namespace Poly;
LL n,mx,c[100010],t[100010],it[100010],ans,ex[200010];
int main()
{
poly f;
scanf("%lld",&n);
for(LL i=1,x;i<=n;++i) scanf("%lld",&x),mx=max(mx,x),++c[x];
f.resize(mx+1);
fac[0]=1;
for(LL i=1;i<=(mx<<1);++i) fac[i]=LL(fac[i-1])*i%(MOD-1);
// for(LL i=0;i<=(mx<<1);++i) ifac[i]=getInv(fac[i],MOD-1);
// printf("%lld\n",getInv(fac[2],MOD));
// printf("(%lld %lld %lld %lld)\n",fac[2],ifac[2],ifac[0],binom(2,2));
for(LL i=0;i<=mx;++i) t[i]=fspow(2,binom(i,2));
for(LL i=0;i<=mx;++i) it[i]=getInv(t[i],MOD);
// for(LL i=1;i<=mx;++i) printf("%lld ",fac[i]); puts("");
// for(LL i=1;i<=mx;++i) printf("%lld ",binom(i,2)); puts("");
// for(LL i=1;i<=mx;++i) printf("%lld ",LL(i)*(i-1)/2%MOD); puts("");
for(LL i=0;i<=mx;++i) f[i]=LL(c[i])*it[i]%MOD;
for(LL i=1;i<=(mx<<1);++i) ex[i]=fspow(2,binom(i,2));
f=f*f;
for(LL i=0;i<len(f);++i) ans=(ans+LL(f[i])*ex[i]%MOD)%MOD;
printf("%lld\n",ans);
return 0;
}

Solution -「CCPC Winter Camp Day 6 A」Convolution的更多相关文章

  1. Solution -「十二省联考2019」春节十二响

    题目 题意简述   link.   给一棵 \(n\) 个结点的有根树,点带权.把点分为若干组,并要求同组内不存在任何祖先-后代关系.最小化每组内的最大点权之和. 数据规模   \(n\le2\tim ...

  2. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  3. 2019 wannafly winter camp day 3

    2019 wannafly winter camp day 3 J 操作S等价于将S串取反,然后依次遍历取反后的串,每次加入新字符a,当前的串是T,那么这次操作之后的串就是TaT.这是第一次转化. 涉 ...

  4. 2019 wannafly winter camp

    2019 wannafly winter camp Name Rank Solved A B C D E F G H I J K day1 9 5/11 O O O O O day2 5 3/11 O ...

  5. 线段树优化建图(cf787d, 2019Wannafly Winter Camp Day7 Div1 E)

    线段树优化建图,用于区间到区间建边时降低空间复杂度 建立两颗线段树,一颗in, 代表进入这个区间,一颗out,代表从这个区间出去 in树从父亲向儿子建边,代表宏观进入整个区间,不向下寻找 out树从儿 ...

  6. 2020 CCPC-Wannafly Winter Camp Day2

    2020 CCPC-Wannafly Winter Camp Day2 A 托米的字符串 虽然每个子串出现的概率是相同的,但是同一长度的子串个数是不同的,所以要分别处理.计算出某一长度的情况下,元音字 ...

  7. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  8. Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory

    Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...

  9. SSH连接时出现「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」解决办法

    用ssh來操控github,沒想到連線時,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」,後面還有一大串英文,這時當然要向Google大神求助 ...

  10. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

随机推荐

  1. 2023-06-17:说一说redis中渐进式rehash?

    2023-06-17:说一说redis中渐进式rehash? 答案2023-06-17: 在Redis中,如果哈希表的数组一直保持不变,就会增加哈希冲突的可能性,从而降低检索效率.为了解决这个问题,R ...

  2. 构建 JavaScript ChatGPT 插件

    聊天插件系统是一种令人兴奋的新方式,可以扩展ChatGPT的功能,纳入您自己的业务数据,并为客户与您的业务互动增加另一个渠道.在这篇文章中,我将解释什么是聊天插件,它们能做什么,以及你如何用JavaS ...

  3. Java 统计大串中小串出现的次数 举例:在字符串"woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun"中java出现了5次

    代码如下: public static void main(String[] args) { //大串 String max = "woaijavawozhenaijavawozhendea ...

  4. 统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

    前言   在ubuntu上发布qt程序相对还好,使用脚本,但是在统信UOS麒麟上发布的时候,因为银河麒麟等不同版本,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的效果,使用linuxdep ...

  5. 论文日记一:AlexNet

    1.导读 ALexNet在2012图像识别竞赛中ILSVRC大放异彩,直接将错误了降低了近10个百分点. 论文<ImageNet Classification with Deep Convolu ...

  6. 2023-07-08:RabbitMQ如何做到消息不丢失?

    2023-07-08:RabbitMQ如何做到消息不丢失? 答案2023-07-08: 1.持久化 发送消息时设置delivery_mode属性为2,使消息被持久化保存到磁盘,即使RabbitMQ服务 ...

  7. Python中 sys.argv[]用法详解

    sys.argv[0]表示代码本身文件路径. sys.argv[]是一个从程序外部获取参数的桥梁,从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一 ...

  8. 给SqlSugar一个优化建议

    声明:本作者无恶意只是觉得这个功能很不错,平常工作当中经常用到,自己框架也做了相应的支持,本着技术共享目的. 一.对象组合设置列更新支持 建议度:高 业务场景 1.更新列表需统一设置 例如:修改人ID ...

  9. Codeforces Round #875 (Div. 2) A-D

    比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...

  10. ubuntu安装msf签名认证失败

    添加命令 apt-get --allow-unauthenticated upgrade 来允许未认证签名软件安装,但是可能有恶意软件安装进来,可以使用 sudo apt-key adv --keys ...