K. paulzhou和方程
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/102400K (Java/Other)
Total Submission(s) : 8 Accepted Submission(s) : 6
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
众所周知,paulzhou的数学不太好。现在他有一个问题,希望你帮他解答:
给定一元n次方程
定义
的前k项和
现给出n、n+1个各项的系数
以及k,求
其中
给定一元n次方程
![](http://i4.buimg.com/595817/fc6385bb722437a1.gif)
定义
![](http://i4.buimg.com/595817/8b7d5896eff830da.gif)
![](http://i4.buimg.com/595817/f3ee0fc69577170a.gif)
现给出n、n+1个各项的系数
![](http://i4.buimg.com/595817/de037b23b21ec4d6.gif)
![](http://i4.buimg.com/595817/bf751d3d4d449016.gif)
其中
![](http://i4.buimg.com/595817/79d79c3d5a96575f.gif)
Input
第1行输入T(1≤T≤10),代表有T组数据。
紧接着每3行分别为n,各项系数
,k,输入数据均为正整数。
紧接着每3行分别为n,各项系数
![](http://i4.buimg.com/595817/de037b23b21ec4d6.gif)
Output
每组测试数据输出一行,输出的
前k-1项和
并对10007取模。
![](http://i4.buimg.com/595817/8b7d5896eff830da.gif)
![](http://i4.buimg.com/595817/f3ee0fc69577170a.gif)
Sample Input
1 4 1 -2 3 1 0 3
Sample Output
21
暴力找循环节。。。。
正解如下
考虑k非常大,所以我们希望用一个公式或者一个特殊的做法把前k项和弄出来。
参考《组合数学》(原书第五版 )8.2差分序列和Stirling数,P173例子。
这样就可以利用上述两个结论,得出前k项和的公式,我们就可以在O(n^2)的复杂度内完成统计了。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define LL long long
#define N 10005
#define mod 10007
LL c[N];
LL n;
LL f(LL x)
{
LL base=1;
LL ans=0;
for(LL i=0; i<=n; i++)
{
ans+=((c[i]%mod)*(base));
ans%=mod;
base*=x;
base%=mod;
}
return ans;
}
LL F[N],sum[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
for(LL i=0; i<=n; i++)
scanf("%lld",&c[i]);
LL k;
scanf("%lld",&k);
sum[0]=F[0]=f(0);
if(k>10006)
{
for(LL i=1; i<=10006; i++)
F[i]=f(i),sum[i]=sum[i-1]+F[i],sum[i]%=mod;
k--;
LL bei=k/10007;
bei%=mod;
k%=10007;
LL ans=(bei*sum[10006])%mod;
ans+=sum[k];
ans%=mod;
printf("%lld\n",ans);
}
else
{
for(LL i=1; i<=k; i++)
F[i]=f(i),sum[i]=sum[i-1]+F[i],sum[i]%=mod;
printf("%lld\n",sum[k-1]%10007);
}
}
return 0;
}