loj#6485. LJJ 学二项式定理(单位根反演)
题面
题解
首先你要知道一个叫做单位根反演的东西
\]
直接用等比数列求和就可以证明了
而且在模\(998244353\)意义下的\(\omega_k^1=g^{P-1\over k}\)
据说这玩意儿在\(NTT\)的证明里有?然而我那时候光顾着背板子了
所以这个单位根反演简称小单的玩意儿能干嘛呢
然后我们惊奇的发现小单可以让我们快速求一个数列里某个数倍数项的和
\sum_{i=1}^n a_i[k|i]
&={1\over k}\sum_{i=1}^na_i\sum_{j=0}^{k-1}{\omega_k^{ji}}\\
&={1\over k}\sum_{j=0}^{k-1}\sum_{i=1}^na_i{\omega_k^{ji}}\\
&={1\over k}\sum_{j=0}^{k-1}f(\omega_k^j)
\end{aligned}
\]
其中\(f\)表示\(a_i\)的生成函数,上面那个意思是把\(\omega_k^j\)代入这个生成函数中的\(x\)
那么复杂度就能从\(n\)倾向于\(k\)了
我们回到题目中来,首先肯定是要把模\(4\)同余的数分别求和再乘上\(a_i\)的
考虑要求和的式子,是\(\sum_{i=0}^n {n\choose i}S^i=\sum_{i=0}^n {n\choose i}S^{n-i}\)
把它化成形式幂级数的形式,是\(\sum_{i=0}^n{n\choose i}S^{n-i}x^i=(x+S)^n\)
很好,对于如果把这个式子记成\(f(x)\),那么我们就能用快速幂\(O(\log n)\)算出所有是\(4\)的倍数的项的和了
然而这里不是只有\(4\)的倍数的项啊?还需要算模\(4\)余\(1,2,3\)的项的和啊?
这也没问题,我们考虑把这个多项式平移,比方说多项式乘个\(x\),那么原来模\(4\)余\(1\)的项就变成了模\(4\)余\(2\)。以此类推,我们就能求出模\(4\)余\(1,2,3\)的和了
综上
ans
&=\sum_{k=0}^3a_k\sum_{j=0}^{n}{n\choose i}S^i[i\equiv k\ \bmod\ 4]\\
&=\sum_{k=0}^3a_k\sum_{j=0}^{n}{n\choose i}S^{n-i}[n-i\equiv k\ \bmod\ 4]\\
&=\sum_{k=0}^3a_{n-k\bmod 4}\sum_{j=0}^{n}{n\choose i}S^{n-i}[i\equiv k\ \bmod\ 4]\\
&={1\over 4}\sum_{k=0}^3a_{n-k\bmod 4}\sum_{j=0}^{3}{f(\omega_4^j)\over \omega_4^{jk}}\\
\end{aligned}
\]
然后没有然后了
//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
ll read(){
R ll res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int P=998244353;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R ll y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
return res;
}
const int w[4]={1,911660635,998244352,86583718};
const int invw[4]={1,86583718,998244352,911660635};
ll n,now,a[4];int s,res,f[4];
int main(){
// freopen("testdata.in","r",stdin);
for(int T=read();T;--T){
n=read(),s=read(),a[0]=read()%P,a[1]=read()%P,a[2]=read()%P,a[3]=read()%P;
fp(i,0,3)f[i]=ksm((w[i]+s)%P,n);
res=0;
fp(i,0,3){
now=0;fp(j,0,3)now+=f[j];
fp(j,0,3)f[j]=mul(f[j],invw[j]);
res=add(res,now*a[(n-i+4)%4]%P);
}
print(mul(res,748683265));
}
return Ot(),0;
}
loj#6485. LJJ 学二项式定理(单位根反演)的更多相关文章
- loj 6485 LJJ学二项式定理 —— 单位根反演
题目:https://loj.ac/problem/6485 先把 \( a_{i mod 4} \) 处理掉,其实就是 \( \sum\limits_{i=0}^{3} a_{i} \sum\lim ...
- [LOJ 6485]LJJ学二项式定理(单位根反演)
也许更好的阅读体验 \(\mathcal{Description}\) 原题链接 \(T\)组询问,每次给\(n,s,a_0,a_1,a_2,a_3\)求 \(\begin{aligned}\left ...
- LOJ 6485 LJJ 学二项式定理——单位根反演
题目:https://loj.ac/problem/6485 \( \sum\limits_{k=0}^{3}\sum\limits_{i=0}^{n}C_{n}^{i}s^{i}a_{k}[4|(i ...
- loj #6485. LJJ 学二项式定理 单位根反演
新学的黑科技,感觉好nb ~ #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s". ...
- LOJ #6485 LJJ 学二项式定理
QwQ LOJ #6485 题意 求题面中那个算式 题解 墙上暴利 设$ f(x)=(sx+1)^n$ 假设求出了生成函数$ f$的各项系数显然可以算出答案 因为模$ 4$的缘故只要对于每个余数算出次 ...
- loj #6485. LJJ 学二项式定理 (模板qwq)
$ \color{#0066ff}{ 题目描述 }$ LJJ 学完了二项式定理,发现这太简单了,于是他将二项式定理等号右边的式子修改了一下,代入了一定的值,并算出了答案. 但人口算毕竟会失误,他请来了 ...
- LOJ 6485 LJJ学多项式
前言 蒟蒻代码惨遭卡常,根本跑不过 前置芝士--单位根反演 单位根有这样的性质: \[ \frac{1}{n}\sum_{i=0}^{n-1}\omega_{n}^{ki}=\left[n|k\rig ...
- 【LOJ#6485】LJJ 学二项式定理(单位根反演)
[LOJ#6485]LJJ 学二项式定理(单位根反演) 题面 LOJ 题解 显然对于\(a0,a1,a2,a3\)分开算答案. 这里以\(a0\)为例 \[\begin{aligned} Ans&am ...
- LOJ6485 LJJ 学二项式定理 解题报告
LJJ 学二项式定理 题意 \(T\)组数据,每组给定\(n,s,a_0,a_1,a_2,a_3\),求 \[ \sum_{i=0}^n \binom{n}{i}s^ia_{i\bmod 4} \] ...
随机推荐
- Spring Boot 集成RabbitMQ
在Spring Boot中整合RabbitMQ是非常容易的,通过在Spring Boot应用中整合RabbitMQ,实现一个简单的发送.接收消息的例子. 首先需要启动RabbitMQ服务,并且add一 ...
- Anti-pattern(反模式)
常见的与“直觉”相背离的 anti-pattern 产生的实际原因是我们没有深入全面地考虑问题. 即只关注到自己关心的方面,忽略了其他重要的.恰好起相反作用的因素. 所以这个“直觉”是不成熟.不全面的 ...
- ES6相关实用特性
本文总结ECMAScript6相关实用特性 目录 let和const 箭头函数 class 对象字段 模板字符串 解构赋值 函数参数扩展 迭代器for...of 模块加载 map和weakmap se ...
- HDLM命令dlnkmgr详解之四_monitor/offline/online
1. monitor 以一定的时间间隔监控hba或cha口的IO信息. 命令格式 监控hba口的IO信息: dlnkmgr monitor -hbaid HBA_ID [-intvl Interval ...
- Recovery of DISKGROUP in VXVM (ZT)
http://gurkulindia.com/main/2012/03/recovery-of-diskgroup-in-vxvm-veritas-volume-manager/# Since lon ...
- How to Enabling and Diabling VxDMP devices for use with Oracle ASM
Enable DMP support for ASM to make DMP devices visible to ASM as available disks To make DMP devices ...
- 部署和调优 2.0 squid服务介绍
Squid 是比较知名的代理软件, 它不仅可以跑在 Linux 上还可以跑在 Windows 以及 Unix上,它的技术已经非常成熟.目前使用 Squid 的用户也是十分广泛的.Squid 与 Lin ...
- 信号量sem 的用法
#include <semaphore.h> sem_t sem; sem_init(&sem, 0, 0); sem_post(&sem); sem_wait(& ...
- find查找、split分隔、replace替换
#!/usr/bin/env python r = "asada" ret = r.find("d") print(ret)#返回所在位置的索引 ret =r. ...
- 图片缓存核心类LruCache
该类类似一个缓存池,具体可参考 http://www.fengfly.com/plus/view-214546-2.html