2018QBXT刷题游记(3)

【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(i1)
同理,对 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(i1)。(注意这里的 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)=0i=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[i1](x)f[i1](x1)x=1,2,,ni=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 &lt; = 1000 m&lt;=1000 m<=1000
对于 60%的数据, m &lt; = 1 0 6 m&lt;=10^6 m<=106
对于 100%的数据, n &lt; = 1000 , m &lt; = 1 0 9 , 0 &lt; = f ( i ) &lt; 100007 n&lt;=1000, m&lt;=10^9, 0&lt;=f(i)&lt;100007 n<=1000m<=1090<=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=0i(1)jC(m,j)f[0](ij)

需要注意的是,模数不是质数,所以不能用卢卡斯定理。

一开始以为是扩展卢卡斯,后来发现这题数据比较小,没必要这么麻烦。对分子和分母分解质因数即可。

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值