题目描述:
题解:
1.利用快速幂取模将g(x)给求出来。
2.分析a1,a2,a3…ak。发现可以通过隔板法做:
一、
我们先建立以下模型:
当k=3,g(x)=7时。
就是在以上七个球之间添加两块板。
那所有的情况就是:C(k−1,n−1)。
答案最大可以达到:C(100,1000)。
因为没有取模所以需要高精度加法和递推式:C(r,n) = C(r-1,n-1)+C(r,n-1)。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 150;
int f[1005][105][N];
LL ksm(LL a,LL n)
{
LL res=1;
while (n)
{
if(n&1)res=res*a%1000;
n=n>>1;
a=a*a%1000;
}
return res;
}
void add(int a[],int b[],int c[])
{
for(int i=0,t=0;i<N;i++)
{
t+=a[i]+b[i];
c[i]+=t%10;
t=t/10;
}
}
int main()
{
LL n,k,x;
cin>>k>>x;
n=ksm(x,x);
for(int i=0;i<n;i++)
{
for(int j=0;j<=i&&j<k;j++)
{
if(!j)f[i][j][0]=1;
else add(f[i-1][j-1],f[i-1][j],f[i][j]);
}
}
int *g = f[n - 1][k - 1];
int t = N - 1;
while(!g[t]) t--;//这一步是去掉前面的前导零
while(t >= 0) cout << g[t--];
return 0;
}