欧拉函数(复变函数) 五边形数 分割函数 k部分拆数
欧拉函数(复变函数)
将这个式子展开
其中 x x x 的次数, 3 k 2 − k 2 \frac{3k^2-k}{2} 23k2−k,为广义五边形数
将得到的所有项按升幂排列,得到:
分割函数
定义:将正整数 n n n 拆分为若干个正整数的和(允许同一个数使用多次,这里的拆分是无序的,即 1+2 和 2+1 等价)的方案数。
欧拉函数的倒数是划分数(分割函数)的生成函数:
其中 p ( i ) p(i) p(i) 为 i i i 的分割函数
有
展开得到递推式
分割函数的代码实现 O ( n n ) O(n\sqrt{n}) O(nn)
#include<bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
const int maxn (1e5+7);
const int INF (1<<30);
long long f[maxn];
inline int a(int x){
return (3*x*x-x)/2;
}
int main(){
int n,p;
cin>>n>>p;
f[0]=1;
FOR(i,1,n){
FOR(j,1,INF){
int x=a(j),y=a(-j);
if(x<=i) f[i]=((f[i]+(j&1?1:-1)*f[i-x])%p+p)%p;
//f(i)=f(i)+(-1)^(j+1)*f(i-x)
if(y<=i) f[i]=((f[i]+(j&1?1:-1)*f[i-y])%p+p)%p;
if(x>i or y>i) break;
}
}
cout<<f[n];
return 0;
}
五边形数
通项公式:
广义五边形数的公式和五边形数相同,只是 n 可以为负数和零,n 依序为0, 1, -1, 2, -2, 3, -3, 4…,广义五边形数也可以用下式表示:
n 依序为0, 1, 2, 3, 4, 5, 6, 7, 8…
其产生的数列如下:
0, 1, 2, 5, 7, 12, 15, 22, 26…
k部分拆数
将 n n n 分成恰有 k k k 个部分的分拆,称为 k k k 部分拆数,记作 p ( n , k ) p(n,k) p(n,k)。
递推式: p ( n , k ) = p ( n − 1 , k − 1 ) + p ( n − k , k ) p(n,k)=p(n-1,k-1)+p(n-k,k) p(n,k)=p(n−1,k−1)+p(n−k,k)
例题:计算 k k k 部分拆数 p ( n , k ) p(n,k) p(n,k)。多组输入,其中 n n n 上界为 10000 10000 10000, k k k 上界为 1000 1000 1000,对 1 e 9 + 7 1e9+7 1e9+7 取模。
#include<bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
const int mod=1e9+7;
int p[10005][1005];
int main() {
cin.tie(0)->sync_with_stdio(0);
int n,k;
while(cin>>n>>k) {
memset(p,0,sizeof(p));
p[0][0]=1;
int i;
FOR(i,1,n){
FOR(j,1,k)
if(i-j>=0) p[i][j]=(p[i-j][j]+p[i-1][j-1])%mod;
}
cout<<p[n][k]<<'\n';
}
}