loj #6485. LJJ 学二项式定理

本文探讨了单位根反演在解决特定组合问题中的应用,通过构造生成函数和利用单位根的性质,实现了对序列中特定下标的元素求和。特别地,文章详细解释了如何使用单位根反演求解模意义下的多项式系数和问题。

给定$n,s,a_0,a_1,a_2,a_3$,求

$$\sum_{i=0}^{n} {n \choose i} s^i a_{i \bmod 4}$$

答案对$998244353$取模

$1 \le n \le 10^{18}, 1 \le s,a_0,a_1,a_2,a_3 \le 10^8$

一脸绝望

在高中的时候,数学老师教会了我们$(a+b)^{n}=\sum_{i=0}^{n}{n \choose i}a^{i}b^{n-i}$,然后惊喜的发现这道题不能这么做!

在$OI$中,我们学习了单位根的基本性质,关于单位根还有一个迷之用法——单位根反演


 

对于数列$a_i$,构造其生成函数$f(x)=\sum_{i=0}^{n}a_ix^i$

现在我们想知道所有下标是$k$的倍数的$a_i$的和,既$\sum_{i=0}^{n}a_i[k|i]$


 

有一个关于$n$次单位根$w_n$的等式,看起来十分有趣毒瘤

$$[n|k]=\frac{1}{n}\sum_{i=0}^{n-1}\omega_n^{ki}$$

证明:

如果$n \mid k$,设$k=np$,则

$$\frac{1}{n}\sum_{i=0}^{n-1}w_n^{npi \bmod n}=\frac{1}{n}\sum_{i=0}^{n-1}w_n^{0}=1$$

如果$n \nmid k$,根据等比数列求和公式,则

$$\frac{1}{n}\sum_{i=0}^{n-1}\omega_{n}^{ki}=\frac{1}{n}(w_n^{0}\frac{1-\omega_n^{k(n-1)}}{1-w_n^{k}})=\frac{w_n^0-w_n^{kn}}{n(1-\omega_n^{k})}=0$$


 

于是对于$N$次单位根$w_N$可以这么搞:

$$\frac{\sum_{i=0}^{N-1}f(w_N^i)}{N}=\frac{\sum_{i=0}^{n}a_i\sum_{j=0}^{N-1}w_N^{ij}}{N}=\sum_{i=0}^{n}a_i[N \mid i]$$

于是就可以得到所有下标是$N$的倍数的$a_i$的和了


 

但是发现,只知道所有$N \mid i$的$a_i$的和还不够有用,如果分别知道$i \bmod N \in [0,N-1]$的$a_i$的和的话就十分有用了

数学老师告诉我们,$f(x)$通过乘以$x$的若干次幂可以实现函数的平移(虽然说这句话不太严谨……但还是可以凑合着看看……)

比如说现在有$f(x)=a_0x^{0}+a_1x^{1}+a_2x^{2} + \dots$

对其乘上$x^{-1}$后会得到$f(x)x^{-1}=a_0x^{-1}+a_1x^{0}+a_2x^{1} + \dots$

再用上面的方法求后就得到了$N \bmod i = 1$的所有$a_i$和


 

在这道题中,构造$f(x)=\sum_{i=0}^{n} {n \choose i} s^i x^i 1^{n-i}=(sx+1)^n$

则答案为$\sum_{i=0}^{3}a_ic_i$,其中$c_i=\sum\limits_{j=0}^{n}{n \choose j}s^j[j \bmod 4 = i]$

对于$c_i$的$f(\omega_N^j)$,因为需要将$\omega_N^{j}$向右平移$i$次,只需要将其变为$\huge \frac{f(\omega_N^j)}{\omega_N^{ij \bmod 4}}$即可


 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int p = 998244353, g = 3;
 5 ll pw(ll a, ll b) {
 6     ll r = 1;
 7     for( ; b ; b >>= 1, a = a * a % p) if(b & 1) r = r * a % p;
 8     return r;
 9 }
10 ll n, s, a[4], w[4], c[4];
11 int main() {
12     int T; scanf("%d", &T);
13     ll wn = pw(g, (p - 1) / 4), inv4 = pw(4, p - 2);
14     w[0] = 1; for(int i = 1 ; i < 4 ; ++ i) w[i] = w[i - 1] * wn % p;
15     while(T --) {
16         scanf("%lld%lld", &n, &s);
17         for(int i = 0 ; i < 4 ; ++ i) scanf("%lld", &a[i]), c[i] = 0;
18         for(int i = 0 ; i < 4 ; ++ i) {
19             for(int j = 0 ; j < 4 ; ++ j)
20                 c[i] = (c[i] + pw((1 + w[j] * s % p) % p, n) * pw(w[i * j % 4], p - 2) % p) % p;
21             c[i] = c[i] * inv4 % p;
22         }
23         ll sum = 0;
24         for(int i = 0 ; i < 4 ; ++ i) sum = (sum + a[i] * c[i] % p) % p;
25         printf("%lld\n", sum);
26     }
27 }
loj #6485. LJJ 学二项式定理

 

一些资料

shadowice1984 loj6485 LJJ学二项式定理

DT_Kang 【4.13 提高班小记】单位根&&杂题

Zhang-RQ 单位根反演学习笔记

Mys_C_K [真学习笔记] 前夕 - 单位根反演 - 广义容斥

Regina8023 【BZOJ 3328】PYXFIB

转载于:https://www.cnblogs.com/KingSann/articles/9471190.html

【电力系统】单机无穷大电力系统短路故障暂态稳定Simulink仿真(带说明文档)内容概要:本文档围绕“单机无穷大电力系统短路故障暂态稳定Simulink仿真”展开,提供了完整的仿真模型与说明文档,重点研究电力系统在发生短路故障后的暂态稳定性问题。通过Simulink搭建单机无穷大系统模型,模拟不同类型的短路故障(如三相短路),分析系统在故障期间及切除后的动态响应,包括发电机转子角度、转速、电压和功率等关键参数的变化,进而评估系统的暂态稳定能力。该仿真有助于理解电力系统稳定性机理,掌握暂态过程分析方法。; 适合人群:电气工程及相关专业的本科生、研究生,以及从事电力系统分析、运行与控制工作的科研人员和工程师。; 使用场景及目标:①习电力系统暂态稳定的基本概念与分析方法;②掌握利用Simulink进行电力系统建模与仿真的技能;③研究短路故障对系统稳定性的影响及提高稳定性的措施(如故障清除时间优化);④辅助课程设计、毕业设计或科研项目中的系统仿真验证。; 阅读建议:建议结合电力系统稳定性理论知识进行习,先理解仿真模型各模块的功能与参数设置,再运行仿真并仔细分析输出结果,尝试改变故障类型或系统参数以观察其对稳定性的影响,从而深化对暂态稳定问题的理解。
可并堆是一种支持合并操作的堆数据结构,常见的可并堆有左偏树、斜堆、二项堆等。对于 LOJ#P188 可并堆的问题,下面以左偏树为例给出解题思路和代码实现。 ### 解题思路 1. **左偏树的性质**: - 左偏树是一种可并堆,它满足堆性质(小根堆或大根堆),即每个节点的值小于(或大于)其子节点的值。 - 左偏树还满足左偏性质,即每个节点的左子树的距离(到最近的叶子节点的距离)不小于右子树的距离。 2. **合并操作**: - 合并两个左偏树时,比较两个根节点的值,将值较大的根节点的树合并到值较小的根节点的右子树中。 - 合并后,检查右子树的距离是否大于左子树的距离,如果是,则交换左右子树,以维护左偏性质。 3. **插入操作**: - 插入一个新节点可以看作是合并一个只有一个节点的左偏树和原左偏树。 4. **删除操作**: - 删除根节点后,将其左右子树合并成一个新的左偏树。 ### 代码实现 ```python class Node: def __init__(self, val): self.val = val self.left = None self.right = None self.dist = 0 def merge(x, y): if not x: return y if not y: return x if x.val > y.val: x, y = y, x x.right = merge(x.right, y) if not x.left or (x.right and x.left.dist < x.right.dist): x.left, x.right = x.right, x.left x.dist = (x.right.dist + 1) if x.right else 0 return x def insert(root, val): new_node = Node(val) return merge(root, new_node) def delete(root): return merge(root.left, root.right) # 示例使用 root = None root = insert(root, 3) root = insert(root, 1) root = insert(root, 5) print(root.val) # 输出堆顶元素 root = delete(root) print(root.val) # 输出删除堆顶元素后的堆顶元素 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值