题解
2023-03-18 18:13:45
发布于:上海
13阅读
0回复
0点赞
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cctype>
using namespace std;
const int MAXLEN=2100;
int K,W;
int GCD(int a,int b){return b==0?a:GCD(b,a%b);}
int a[MAXLEN],b[MAXLEN],ans[MAXLEN];
void C(int n,int m)
{
if(n<m) return;
for(int i=m;i>=1;i--)
a[i]=n-m+i,b[i]=i;
for(int i=1;i<=m;i++)
{
if(b[i]==1) continue;
for(int j=m;j>=1;j--)
{
int k=GCD(a[j],b[i]);
b[i]/=k;a[j]/=k;
if(b[i]==1) break;
}
}
memset(b,0,sizeof(b));
b[0]=b[1]=1;
int g=0;
for(int j=1;j<=m;j++)
{
g=0;
if(a[j]==1) continue;
for(int i=1;i<=b[0];i++)
{
b[i]=b[i]*a[j]+g;
g=b[i]/10;
b[i]%=10;
if(i==b[0]&&g!=0) b[0]++;
}
}
ans[0]=max(ans[0],b[0]);
for(int i=1;i<=ans[0];i++)
{
ans[i]+=b[i];
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
if(ans[ans[0]+1]!=0) ans[0]++;
}
int main()
{
scanf("%d%d",&K,&W);
int max_bit=W/K,all_choice=(1<<K)-1,max_firstnum=(1<<W%K)-1;
for(int i=2;i<=max_bit;i++)
C(all_choice,i);
if(max_firstnum>=1&&all_choice>max_bit)
for(int i=1;i<=max_firstnum;i++)
C(all_choice-i,max_bit);
for(int i=ans[0];i>=1;i--) printf("%d",ans[i]);
return 0;
}
这里空空如也
有帮助,赞一个