【2018QBXT刷题游记】
Day1 TEST1
T3 difer
【问题描述】
在数学中, 对光滑函数求微分是一种常见的操作。 在实际应用中, 一些函数没有解析形式, 通常会从函数上取若干个点,用这些点来近似地表示这个函数。
现在有一个函数
f
(
x
)
f(x)
f(x),我们在函数上取
n
n
n个值
f
(
1
)
,
f
(
2
)
,
…
,
f
(
n
)
f(1),f(2),…,f(n)
f(1),f(2),…,f(n)。对函数
f
(
x
)
f(x)
f(x)取微分得到函数
f
’
(
x
)
f’(x)
f’(x)。我们近似地认为
f
’
(
i
)
=
f
(
i
)
−
f
(
i
−
1
)
f’(i)=f(i)-f(i-1)
f’(i)=f(i)−f(i−1)。
同理,对
f
’
(
x
)
f’(x)
f’(x)求微分可以得到
f
’
’
(
x
)
f’’(x)
f’’(x),我们近似地认为
f
’
’
(
i
)
=
f
’
(
i
)
−
f
’
(
i
−
1
)
f’’(i)=f’(i)-f’(i-1)
f’’(i)=f’(i)−f’(i−1)。(注意这里的 f’(i)和 f’(i-1)本身就是我们求的近似值)。
函数
f
’
(
x
)
f’(x)
f’(x)被称为一阶微分,
f
’
’
(
x
)
f’’(x)
f’’(x)被称为二阶微分。如果对函数
f
(
x
)
f(x)
f(x)连续做
m
m
m次微分操作,得到的函数被称为
m
m
m 阶微分。 特殊地,
f
(
x
)
f(x)
f(x)可以被认为是自身的0阶微分。
用
f
[
m
]
(
x
)
f[m](x)
f[m](x)表示
f
(
x
)
f(x)
f(x)的
m
m
m 阶微分,我们认为对任意自然数
m
m
m,有
f
[
m
]
(
0
)
=
0
f[m](0)=0
f[m](0)=0。
在计算近似值时,直接使用这条性质。
输入的是
f
(
1
)
,
f
(
2
)
,
…
,
f
(
n
)
f(1),f(2),…,f(n)
f(1),f(2),…,f(n)
令
f
[
0
]
(
x
)
=
f
(
x
)
,
x
=
1
,
2
,
…
,
n
f[0](x)=f(x), x=1,2,…,n
f[0](x)=f(x),x=1,2,…,n
令
f
[
i
]
(
0
)
=
0
,
i
=
0
,
1
,
…
m
f[i](0)=0, i=0,1,…m
f[i](0)=0,i=0,1,…m
令
f
[
i
]
(
x
)
=
f
[
i
−
1
]
(
x
)
−
f
[
i
−
1
]
(
x
−
1
)
,
x
=
1
,
2
,
…
,
n
,
i
=
1
,
2
,
…
,
m
f[i](x)=f[i-1](x)-f[i-1](x-1), x=1,2,…,n, i=1,2,…,m
f[i](x)=f[i−1](x)−f[i−1](x−1),x=1,2,…,n,i=1,2,…,m
输出的是
f
[
m
]
(
x
)
,
x
=
1
,
2
,
…
,
n
f[m](x) , x=1,2,…,n
f[m](x),x=1,2,…,n
【输入格式】
第一行两个数
n
,
m
n, m
n,m
第二行 n 个数
f
(
1
)
,
f
(
2
)
,
…
,
f
(
n
)
f(1),f(2),…,f(n)
f(1),f(2),…,f(n)
【输出格式】
输出
n
n
n 行, 第
x
x
x 行是
f
[
m
]
(
x
)
f[m](x)
f[m](x)。
结果对
100007
100007
100007 取模
【样例输入】
3 2
6 7 8
【样例输出】
6
100002
0
【数据规模和约定】
对于 30%的数据,
m
<
=
1000
m<=1000
m<=1000
对于 60%的数据,
m
<
=
1
0
6
m<=10^6
m<=106
对于 100%的数据,
n
<
=
1000
,
m
<
=
1
0
9
,
0
<
=
f
(
i
)
<
100007
n<=1000, m<=10^9, 0<=f(i)<100007
n<=1000,m<=109,0<=f(i)<100007
【分析】
可以发现:
f
[
m
]
(
i
)
=
∑
j
=
0
i
(
−
1
)
j
⋅
C
(
m
,
j
)
⋅
f
[
0
]
(
i
−
j
)
f[m](i)=\sum_{j=0}^i (-1)^j·C(m,j)·f[0](i-j)
f[m](i)=j=0∑i(−1)j⋅C(m,j)⋅f[0](i−j)
需要注意的是,模数不是质数,所以不能用卢卡斯定理。
一开始以为是扩展卢卡斯,后来发现这题数据比较小,没必要这么麻烦。对分子和分母分解质因数即可。
#include<iostream>
#include<cstdio>
using namespace std;
#define MOD 100007
#define MAXN 1007
#define ll long long
int n,m,fenzi[MAXN][MAXN],fenmu[MAXN][MAXN],shengyu[MAXN];
int f[MAXN];//初始
int ans[MAXN];
int add(int x,int y){
x+=y;
if(x>=MOD)x-=MOD;
return x;
}
int jian(int x,int y){
x-=y;
if(x<0)x+=MOD;
return x;
}
int mul(int x,int y){
ll ret=x;
ret*=y;
ret%=MOD;x=ret;
return x;
}
int main(){
freopen("difer.in","r",stdin);
freopen("difer.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&f[i]);
for(int i=1;i<=n&&i<=m;i++){//对分子质因数分解
fenzi[i][0]=m+1-i;
for(int j=2;j<=n;j++){
while(fenzi[i][0]%j==0){//保证分解出的一定是质数
fenzi[i][0]/=j;
fenzi[i][j]++;
}
}
fenzi[i][0]%=MOD;
}
for(int i=1;i<=n&&i<=m;i++){//对分母质因数分解
fenmu[i][0]=i;
for(int j=2;j<=n;j++){
while(fenmu[i][0]%j==0){
fenmu[i][0]/=j;
fenmu[i][j]++;
}
}
}ans[0]=1;
for(int i=1;i<=n&&i<=m;i++){
ans[i]=1;
for(int j=1;j<=i;j++)ans[i]=mul(ans[i],fenzi[j][0]);
for(int j=2;j<=n;j++){
shengyu[j]+=(fenzi[i][j]-fenmu[i][j]);
}
for(int j=2;j<=n;j++){
for(int k=1;k<=shengyu[j];k++)ans[i]=mul(ans[i],j);
}
if(i&1)ans[i]=jian(0,ans[i]);
}
for(int i=1;i<=n;i++){
int ret=0;
for(int j=0;j<=i&&j<=m;j++)ret=add(ret,mul(f[i-j],ans[j]));
printf("%d\n",ret);
}
return 0;
}