该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
测试输入是:5 2000
答案是:2147483616
代码如下:
#include
#include#define min(x,y) ((x)
#define max(x,y) ((x)>(y)?(x):(y))
#define rep(i,a,b) for(i=(a);i<=(b);++i)
#define dwn(i,a,b) for(i=(a);i>=(b);--i)#define ll long long int
#define MAX 520
#define ARRMAX 60const int mod=1e4;
int k,n,times,p2;
struct newint{
int arr[ARRMAX];
int len;
}c[MAX],ans;struct newint add(struct newint a,struct newint b){
struct newint c;
c.len=max(a.len,b.len);
int x=0,i;
rep(i,0,c.len){
c.arr[i]=a.arr[i]+b.arr[i]+x;
x=c.arr[i]/mod;
c.arr[i]%=mod;
}
if(x>0)
c.arr[++c.len]=x;
return c;
}
struct newint multi(struct newint a,int b){
struct newint c;
c.len=a.len;
ll x=0;
int i;
rep(i,0,c.len){
c.arr[i]=(1ll*a.arr[i]*b+x)%mod;
x=(1ll*a.arr[i]*b+x)/mod;
}
while(x>0){
c.arr[++c.len]=x%mod;
x/=mod;
}
return c;
}
struct newint devices(struct newint a,int b){
struct newint c;
c.len=a.len;
ll x=0;
int i;
dwn(i,c.len,0){
c.arr[i]=(a.arr[i]+x*mod)/b;
x=(a.arr[i]+x*mod)%b;
}
dwn(i,c.len,1){
if(c.arr[i]==0) c.len--;
else break;
}
return c;
}
int main(){
int i;
for(i=0;i
c[i].len=0;
memset(c[i].arr,0,sizeof(c[i].arr));
}
scanf("%d %d",&k,&n);
p2=(1<
c[0].arr[0]=1;
rep(i,1,min(p2,n/k)){
c[i]=devices(multi(c[i-1],(p2-i+1)),i);
}
rep(i,2,min(p2,n/k)){
ans=add(ans,c[i]);
}
if(n/k<=p2){
c[p2]=c[n/k];
rep(i,1,times){
c[p2-i]=devices(multi(c[p2-i+1],(p2-i+1-n/k)),(p2-i+1));
ans=add(ans,c[p2-i]);
}
}
printf("%d",ans.arr[ans.len]);
dwn(i,ans.len-1,0){
printf("%04d",ans.arr[i]);
}
putchar('\n');
return 0;
}