qbxt基础班 function

函数值
【问题描述】
有一个函数f(x)=anxn+an-1xn-1+……+a1x+a0,有m次询问,每次询问给出一个数ci,求f(ci),也就是x=ci时f(x)的值。
【输入格式】
第一行两个正整数n、m
第二行n+1个正整数,分别是an ,an-1,…,a1,a0
第三行m个正整数,分别是c1,c2,……,cm
【输出格式】
输出m行,第i行一个正整数,表示f(ci)。
由于f(ci)可能会很大,输出结果对10007取模。
【样例输入】
2 3
1 1 2
2 3 5
【样例输出】
8
14
32
【数据规模和约定】
对于30%的数据, n<=10,m<=10,ai <=10,ci <=10
对于60%的数据, n<=1000,m<=1000,ai <=1000,ci <=1000
对于100%的数据,n<=1000,m<=100000,ai <=1000,ci <=1000

这题预处理一波就可以啦。一开始不知道怎么预处理,但是我们可以看到,a数组是固定的,也就是这东西是离线的。那我们得到所有的a,然后预处理一波x,就是把x从1到n全都给算出来,然后O(1)询问即可

#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1050;
const int Mod = 10007;
int a[N];
int f[N];
int n,m;
int main()
{
	//freopen("function.in","r",stdin);
	//freopen("function.out","w",stdout);
	int i,j;
	scanf("%d%d",&n,&m);
	for(i=n;i>=0;i--)
		scanf("%d",&a[i]);
	for(i=1;i<N;i++)
	{
		f[i]=0;
		int now=1;
		for(j=0;j<=n;j++)
		{
			f[i]+=now*a[j];
			f[i]%=Mod;
			now*=i;
			now%=Mod;
		}
	}
	for(i=1;i<=m;i++)
	{
		int now;
		scanf("%d",&now);
		printf("%d\n",f[now]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37073764/article/details/83108373