以下代码 WA 90 pts。
疑问是:疑似是组合数预处理爆 ll 了,但开高精会 MLE,咋办?(似乎有题解也没有开,但应该会爆)
#include<cstdio>
#include<cstring>
#include<iostream>
#define int __int128
using namespace std;
const int N=210,M=600; int c[M][M];
int read() {
int x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=x*10+ch-48; ch=getchar(); }
return x*f;
}
struct Bigint {
int a[N],len;
Bigint(int x=0) {
memset(a,0,sizeof(a));
for(len=1;x>0;len++) a[len]=x%10,x/=10;
len--;
}
int &operator[](int i) { return a[i]; }
void flatten(int l) {
len=l;
for(int i=1;i<=len;i++) a[i+1]+=a[i]/10,a[i]%=10;
for(;len&&a[len]==0;len--);
}
void print() { for(int i=len;i>=1;i--) printf("%lld",a[i]); }
};
Bigint operator+(Bigint a,int b) {
a[1]+=b,a.flatten(a.len+2);
return a;
}
signed main() {
int k=read(),w=read();
for(int i=1;i<=(1<<k);i++) {
c[i][0]=c[i][i]=1;
for(int j=1;j<i;j++) c[i][j]=c[i-1][j-1]+c[i-1][j];
}
Bigint ans(0);
for(int i=2;i<=w/k;i++) ans=ans+c[(1<<k)-1][i];
for(int i=1;i<(1<<(w%k));i++) ans=ans+c[(1<<k)-i-1][w/k];
ans.print();
return 0;
}