题面

传送门

题解

首先你要知道一个叫做单位根反演的东西

\[{1\over k}\sum_{i=0}^{k-1}\omega^{in}_k=[k|n]
\]

直接用等比数列求和就可以证明了

而且在模\(998244353\)意义下的\(\omega_k^1=g^{P-1\over k}\)

据说这玩意儿在\(NTT\)的证明里有?然而我那时候光顾着背板子了

所以这个单位根反演简称小单的玩意儿能干嘛呢

然后我们惊奇的发现小单可以让我们快速求一个数列里某个数倍数项的和

\[\begin{aligned}
\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\)的和了

综上

\[\begin{aligned}
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 学二项式定理(单位根反演)的更多相关文章

  1. loj 6485 LJJ学二项式定理 —— 单位根反演

    题目:https://loj.ac/problem/6485 先把 \( a_{i mod 4} \) 处理掉,其实就是 \( \sum\limits_{i=0}^{3} a_{i} \sum\lim ...

  2. [LOJ 6485]LJJ学二项式定理(单位根反演)

    也许更好的阅读体验 \(\mathcal{Description}\) 原题链接 \(T\)组询问,每次给\(n,s,a_0,a_1,a_2,a_3\)求 \(\begin{aligned}\left ...

  3. 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 ...

  4. loj #6485. LJJ 学二项式定理 单位根反演

    新学的黑科技,感觉好nb ~ #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s". ...

  5. LOJ #6485 LJJ 学二项式定理

    QwQ LOJ #6485 题意 求题面中那个算式 题解 墙上暴利 设$ f(x)=(sx+1)^n$ 假设求出了生成函数$ f$的各项系数显然可以算出答案 因为模$ 4$的缘故只要对于每个余数算出次 ...

  6. loj #6485. LJJ 学二项式定理 (模板qwq)

    $ \color{#0066ff}{ 题目描述 }$ LJJ 学完了二项式定理,发现这太简单了,于是他将二项式定理等号右边的式子修改了一下,代入了一定的值,并算出了答案. 但人口算毕竟会失误,他请来了 ...

  7. LOJ 6485 LJJ学多项式

    前言 蒟蒻代码惨遭卡常,根本跑不过 前置芝士--单位根反演 单位根有这样的性质: \[ \frac{1}{n}\sum_{i=0}^{n-1}\omega_{n}^{ki}=\left[n|k\rig ...

  8. 【LOJ#6485】LJJ 学二项式定理(单位根反演)

    [LOJ#6485]LJJ 学二项式定理(单位根反演) 题面 LOJ 题解 显然对于\(a0,a1,a2,a3\)分开算答案. 这里以\(a0\)为例 \[\begin{aligned} Ans&am ...

  9. 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} \] ...

随机推荐

  1. JQ选择器大全

    jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个 ...

  2. java代码异常普通的====

    总结:对于各种流类, package com.da; //包括运行异常,和非运行异常 import java.io.*; public class ryl { public static void m ...

  3. myelipse中部署路径deploy location出现错误

    背景: 因java_web项目中的所有代码以及资源文件突然无法提交,在尝试过诸多方法无果后,果断删除项目重新将down下来.启动Tomcat无问题,使用原来的访问连接报错.经检查发现加载至Tomcat ...

  4. CAD库中列举所有航路点

    select distinct f1.airway_point_name,f1.latitude,f1.longitude,upper(f1.airway_point_type_name)type,f ...

  5. 2015.3.20 Oracle使用正则表达式

    .Oracle正则表达式使用介绍 正则表达式具有强大.便捷.高效的文本处理功能.能够添加.删除.分析.叠加.插入和修整各种类型的文本和数据.Oracle从10g开始支持正则表达式 ..下面通过一些例子 ...

  6. windows服务编写和“以管理员运行”程序的方法

    本文将首先解释如何 创建 一个定期查询可用物理内存并将结果写入某个文本文件的服务.然后指导你完成生成,安装和实现服务的整个过程. 第一步:主函数和全局定义 首先,包含所需的头文件.例子要调用 Win3 ...

  7. redis使用测试

    import redis conn=redis.Redis(host='127.0.0.1',port=6379) conn.set('nn','morgana',10) #过期时间10s v=con ...

  8. LNMP 1.2 Nginx编译安装

    Nginx官网是:nginx.org 下载稳定版本 cd /usr/local/src wget http://nginx.org/download/nginx-1.8.0.tar.gz tar zx ...

  9. Camera.Parameters 参数 <转>

    http://blog.csdn.net/aiqing0119/article/details/27680137 ------------------------------------------- ...

  10. hadoop-eclipse-plugin-2.6.0-cdh5.4.0 插件编译

    1.JDK配置 1) 安装jdk 2) 配置环境变量 JAVA_HOME.CLASSPATH.PATH等设置 2.Eclipse 1).下载eclipse-jee-juno-SR2.rar 2).解压 ...