题目:https://www.acwing.com/problem/content/1310/可能需要报课才能做
简单一点的一个题
难点:求组合数,不取模
#include <bits/stdc++.h>
#include<iostream>
using namespace std;
typedef long long ll;
const int N=150;
int f[1000][100][N]; //高精度数组
int kmi(int a,int b,int q){ //快速幂
int ans=1;
while(b){
if(b&1)ans=ans*a%q;
a=a*a%q;
b=b>>1;
}
return ans;
}
void add(int c[],int a[],int b[]){ //大数加法
for(int i=0,t=0;i<150;i++){ //对应的相加
t+=a[i]+b[i]; //不会超过150位,后面相加都是0进行运算
c[i]=t%10;
t=t/10;
}
return ;
}
int main()
{
int k,x;
cin>>k>>x;
int n=kmi(x%1000,x,1000); //三维数组第三维是高精度
for(int i=0;i<n;i++){ //算组合数模板
for(int j=0;j<k&&j<=i;j++){
if(!j)f[i][j][0]=1; //传二维,用一维接受,那么控制的访问范围只要不超N
else add(f[i][j],f[i-1][j],f[i-1][j-1]);//那么就是控制的第三维的数进行运算
}
}
int *q=f[n-1][k-1];//获取对应的第三维高精度
int i=150;
while(!q[i])i--; //第一个非0的最高位
while(i>=0)cout<<q[i--];
return 0;
}