FDFZ JXD 作业
more >>1 | #include<bits/stdc++.h> |
1 | #include<bits/stdc++.h> |
$\tbinom{n}{k}$ 组合意义: 从 $n$ 个不同元素的集合中选取 $k$ 个元素作为子集的方案数。
六边形性质(帕斯卡三角形中)
(1)对称恒等式
(2)吸收恒等式
推论:
(3)加法恒等式
二项式定理
范德蒙德卷积
组合意义:$r$ 个 $0$ 和 $s$ 个 $1$ 中选取 $n$ 个数的方案数
数列 $a_0,a_1,…$ 的生成函数,定义为以 $a_i$ 为系数的形式幂级数,即
二项式定理: 组合数 $C_{n}^{i}$ 的生成函数为 $F(x)=(1+x)^n$
现有 $n$ 个数,每个数为 $a_i$,可以取无限次,请问有多少方案可以让所有数的和为 $m$。
答案为
的展开式中 $x^m$ 的系数。
其中,$x^m$ 相当于每一个因式中,选择一个数的指数相加为 $m$。所以得到的 $x^m$ 的项数即解,
同样,我们可以从 $dp$ 去想。设 $f(i,j)$ 为前 $i$ 个数中和为 $j$ 的情况。考虑决策,为总和做出 $+1$,$+a_i$,$+2a_i$,…的贡献,而这些就组成了这个因式的所有指数。
现有 $n$ 个数,每个数为 $a_i$,可以取 $b_i$ 次,请问有多少种方案可以让所有数的和为 $m$。
答案为
的展开式中 $x^m$ 的系数。
此题和例题1.1中唯一的不同是每个数都有了自己的最多取几个,所以决策变成了为总和做出 $+1$,$+a_i$,…,$+a_ib_i$ 的贡献,于是因式便不再是无穷级数。
KK P463 定制背包
根据题目列出生成函数
对于此类多项式,有等比数列求和&等比级数求和公式
于是我们可以将上述多项式化简为
看这个式子的组合意义,即将n拆成3个自然数的和。答案为 $C_{2}^{n+2}$ 。
(摘自 x义x的博客)求十进制下,$5$ 的数字个数为偶数的 $n$ 位数(不能有前导0)
先看 $dp$,$f_n$ 为 $5$ 的个数为偶数的 $n$ 位数个数,$g_n$ 为 $5$ 的个数为奇数的 $n$ 位数个数。
设 $f,g$ 的普通型生成函数为 $F(x),G(x)$,我们用错位相减法。怎么减呢?我们看 $F(x)=\sum_{i=0}^{\infty} f_ix^i$ ,那么为了减得我们已经知道的数($f1,g1$ ),我们需要用 $F(x)-xF(x)$ 。我们看这题的转移方程,可以得到应该这样列式子
把 $F(x),G(x)$ 当做未知数去解方程。解得
我们看到 $\frac{1}{1-8x},\frac{1}{1-10x}$ 都是可以用等比级数求和公式的。所以我们把上述式子做裂项得
上述式子 $x^n$ 的系数显然是 $\frac{1}{2}(7\times 8^n+9\times 10^n)$。
UVA 12298 Super Poker II
有一副扑克,对于每一个合数都有四种花色的牌。
某些牌已经丢失,求出在剩下的牌中选出花色互不相同的四张且点数之和为 $n$ 的方案数。
列出生成函数
所以我们需要列出4个多项式,然后求出 $F(x)$,输出 第 $a$ 项到第 $b$ 项的系数即可。
洛谷稍具体一些的题解:https://www.luogu.com.cn/blog/forever-captain/solution-uva12298
1 | #include<bits/stdc++.h> |
给定一个长为 $n$ 的序列 a,求出其 $k$ 阶差分或前缀和。结果的每一项都需要对 $1004535809$ 取模。
$1\le n\le 10^5,\quad 0\le a_I\le 10^9,\quad 1\le k\le 10^{2333}$
对于生成函数 $F(x)$,$F(x)$ 的差分即 $(1-x)F(x)$ ,$F(x)$ 的前缀和即 $\frac{1}{1-x}F(x)$。
所以 $F(x)$ 的 $k$ 阶差分,前缀和分别为 $(1-x)^kF(x)$ 和 $(\frac{1}{1-x})^kF(x)$。
经过一系列我也不知道的玄学推导,得出
$K$ 阶差分为
$K$ 阶前缀和为
由于这是 NTT 模数,所以卷一卷就可以了。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000009,mod=1004535809,ig=334845270,g=3;
int n,m,k,t,f[N],a[N],r[N]; string kk;
int ksm(int a,int b){
if(b==0) return 1;
else if(b==1) return a;
else return ksm(a*a%mod,b/2)*(b%2?a:1)%mod;
}
void ntt(int *q,int type){
for(int i=0;i<n;i++)
if(i<r[i]) swap(q[i],q[r[i]]);
for(int i=1;i<n;i*=2){
int wn=ksm((type>0)?g:ig,(mod-1)/(i*2));
for(int j=0;j<n;j+=i*2)
for(int k=0,w=1;k<i;k++,w=w*wn%mod){
int x=q[j+k],y=q[i+j+k]*w%mod;
q[j+k]=(x+y)%mod,q[i+j+k]=(x-y+mod)%mod;
}
}
if(type<0){
int in=ksm(n,mod-2);
for(int i=0;i<n;i++) q[i]=q[i]*in%mod;
}
}
int orz(string s){
int d=0;
for(int i=0;i<s.size();i++) d=(d*10+(s[i]-'0'))%mod;
return d;
}
signed main(){
cin>>n>>kk>>t; m=n;
for(int i=1;i<=n;i++) scanf("%d",&f[i]);
k=orz(kk);
a[0]=1;
for(int i=1;i<=n;i++)
if(t==0) a[i]=a[i-1]*(k+i-1)%mod*ksm(i,mod-2)%mod;
else a[i]=-1*a[i-1]*(k-i+1+mod)%mod*ksm(i,mod-2)%mod;
int l=0; m+=n;
for(n=1;n<=m;n*=2) l++;
for(int i=0;i<n;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
ntt(f,1), ntt(a,1);
for(int i=0;i<n;i++) f[i]=f[i]*a[i]%mod;
ntt(f,-1);
for(int i=1;i<=m/2;i++) printf("%lld ",f[i]);
return 0;
}
$\gcd (x,y)=1$ 且 $f(xy)=f(x)f(y)$,则 $f(n)$ 为积性函数。
若 $f(x),g(x)$ 为积性函数,那么
也为积性函数
所有积性函数都可以通过线性筛去筛出来。
定义式
计算方法
$O(n)$ 批量计算
线性筛筛质数,筛到 $k=x\times p$ 时
1 | void mobius(){ |
$O(\sqrt n)$ 单个计算
对 $1$ 到 $\sqrt{n}$ 做线性筛,由于大于 $\sqrt{n}$ 的质因数最多只有一个,所以最后判断一下即可。
性质
对于函数 $f(x)$,设 $g(x)=\sum_{x\mid d }f(d)$ ,d则有
也有,
T1 求
解法一
看到后面那个式子可以想到莫比乌斯反演中提到的第二个公式,$n=\gcd(i,j),m=1$,于是进行变形
看到第三个求和的条件 $d\mid \gcd(i,j)$,可以转换为 $d\mid i,d\mid j$
我们看到最难受的最后一个求和,想把它移到前面去,需要确定范围 $d\in [1,\min(n,m)]$
然后对于后面两个求和的范围,我们看到,既然 $d$ 已定,$d$ 一定是 $i,j$ 的约数,那么 $i,j$ 一定是 $d$ 的倍数
把 $\mu$ 移到前面去
然后化简最后的两个求和
可以 $O(n)$ 解决。
多组的话也可以线性筛去预处理,然后后面整除分块+前缀和解决。
解法二
设 $f(x)=\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=x],\quad g(x)=\sum_{x\mid d}f(d)$
然后计算 $g(d)$
带入+整除分块即可
T2 【[POI2007]ZAP-Queries】求$f(x)=\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=x]$
这是一个比较基础的转变。如果 $i,j$ 都除以 $x$,那么 $\gcd$ 也除以 $x$。
1 | void xxs(int n){ |
T3 【YY的GCD】求 $\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)\in prime ]$
用莫比乌斯函数性质可得(或者定理提到的第二个东西)
然后会 TLE
显然罪魁祸首是这个 $k$,我们希望这个关于 $k$ 的东西可以放到后面然后预计算。
我们枚举的是 $k$ 和 $d$,我们考虑令 $t=kd$,然后移到前面去于是有
后面的显然可以预计算。
1 | #include<bits/stdc++.h> |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true