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} \] ...
随机推荐
- java代码继承------多层继承
总结:继承.方法的重要性, 运行结果显示: class A is callingclass B is callingclass C is calling package com.addd; //jav ...
- Java-API-Package:org.springframework.stereotype
ylbtech-Java-API-Package:org.springframework.stereotype 1.返回顶部 1. @NonNullApi @NonNullFields Package ...
- 设置android的versionCode
在config.xml里面设置 android-versionCode="1" AndroidManifest.xml 将会修改 android:versionCode=" ...
- Shell编程进阶 2.2 shell数组
给一个字符指定一个数组 怎么显示数组 a= echo $a a=( ) echo $a echo ${a[@]} echo ${a[*]} 指定显示数组中第几个数字 echo ${a[]} echo ...
- OpenGL 着色器 03
着色器(shader)是运行在GPU上小程序. 也是一种非常独立的程序,它们之间不能相互通信:它们之间唯一的沟通只有通过输入和输出. 着色器的开头总是要声明版本,接着是输入和输出变量,uniform和 ...
- django之admin组件
一.面向对象复习 1.类的继承 class Base(object): def __init__(self,val): self.val = val def func(self): self.test ...
- JS中,日期对象(获取当前现在的年份,星期,时间)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 修改LINUX ROOT密码
Connecting to 10.10.70.22:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]' ...
- linux下vtune使用
安装:http://www.cnblogs.com/jiu0821/p/5943533.html 终端输入amplxe-gui,打开vtune界面. 点击new project,进入project p ...
- 使用Get进行Http通信
--------------siwuxie095 有道翻译官网:http://fanyi.youdao.com/ 找到官网页面下方的 有道翻译API,选择 调用数据接口,申请一个 key (申请内容可 ...