90 分求调&疑问
查看原帖
90 分求调&疑问
1308728
xsmfollower楼主2024/7/2 18:50

以下代码 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;
}
2024/7/2 18:50
加载中...