【分析】
这题高精度真是太可爱了。【然后我才发现如今大概只有我这种傻逼才会用10进制的高精度,别人都是4位4位做的,搞的我RE,0msTLE,MLE都试了一通。。
然后就是,跟“已经没有什么好害怕了”无异,具体可以看那篇。
对于至多k,而不是恰好k,就分成恰好0+恰好1+。。。+恰好k就好了。
【再表示一下用结构体重载运算符写高精度真的好看很多】
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 210
#define Maxl 210
#define Mod 10000 int a[Maxn],b[Maxn],mx[Maxn]; struct hugeint
{
int w[Maxl],l;
hugeint() {memset(w,,sizeof(w));l=;}
friend hugeint operator + (hugeint x,hugeint y)
{
x.l=max(x.l,y.l);
for(int i=;i<=x.l;i++) x.w[i]=x.w[i]+y.w[i];
for(int i=;i<=x.l;i++) x.w[i+]+=x.w[i]/Mod,x.w[i]%=Mod;
while(x.w[x.l+]!=) x.w[x.l+]+=x.w[x.l+]/Mod,x.w[++x.l]%=Mod;
while(x.w[x.l]==&&x.l>) x.l--;
return x;
}
friend hugeint operator - (hugeint x,hugeint y)
{
for(int i=;i<=x.l;i++) x.w[i]=x.w[i]-y.w[i];
for(int i=;i<=x.l;i++) if(x.w[i]<) x.w[i]+=Mod,x.w[i+]--;
while(x.w[x.l]==&&x.l>) x.l--;
return x;
}
friend hugeint operator * (hugeint x,hugeint y)
{
hugeint ret;ret.l=x.l+y.l;
for(int i=;i<=x.l;i++) for(int j=;j<=y.l;j++) ret.w[i+j]+=x.w[i]*y.w[j];
for(int i=;i<=ret.l;i++) ret.w[i+]+=ret.w[i]/Mod,ret.w[i]%=Mod;
while(ret.w[ret.l+]!=) ret.w[ret.l+]+=ret.w[ret.l+]/Mod,ret.w[++ret.l]%=Mod;
while(ret.w[ret.l]==&&x.l>) ret.l--;
return ret;
}
friend hugeint operator * (hugeint x,int y)
{
for(int i=;i<=x.l;i++) x.w[i]*=y;
for(int i=;i<=x.l;i++) x.w[i+]+=x.w[i]/Mod,x.w[i]%=Mod;
while(x.w[x.l+]!=) x.w[x.l+]+=x.w[x.l+]/Mod,x.w[++x.l]%=Mod;
while(x.w[x.l]==&&x.l>) x.l--;
return x;
}
friend bool operator > (hugeint x,hugeint y)
{
if(x.l!=y.l) return x.l>y.l;
for(int i=x.l;i>=;i++)
{
if(x.w[i]!=y.w[i]) return x.w[i]>y.w[i];
}
}
};
hugeint f[][Maxn],c[Maxn][Maxn],fac[Maxn],g[Maxn];
void clear(hugeint &x) {memset(x.w,,sizeof(x.w));x.l=;} int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) scanf("%d",&b[i]);
sort(a+,a++n);sort(b+,b++n);
mx[]=;
for(int i=;i<=n;i++)
{
mx[i]=mx[i-];
while(b[i]>a[mx[i]+]&&mx[i]<n) mx[i]++;
}
f[][].w[]=f[][].w[]=;
for(int i=;i<=n;i++)
{
int p=i&,pp=p^;
for(int j=;j<=i;j++)
{
f[p][j]=f[pp][j]+f[pp][j-]*max(mx[i]-j+,);
}
}
for(int i=;i<=n;i++) c[i][].w[]=;
for(int i=;i<=n;i++) for(int j=;j<=i;j++) c[i][j]=c[i-][j-]+c[i-][j];
hugeint a1,a2,ans;
fac[].w[]=;
for(int i=;i<=n;i++) fac[i]=fac[i-]*i;
for(int i=;i<=n;i++) g[i]=f[n&][i]*fac[n-i];
for(int i=;i<=k;i++)
{
clear(a1);clear(a2);
for(int j=n;j>=i;j--)
{
if((j-i)&) a2=a2+g[j]*c[j][i];
else a1=a1+g[j]*c[j][i];
if(a1>a2) {a1=a1-a2;clear(a2);}
}
ans=ans+(a1-a2);
}
printf("%d",ans.w[ans.l]);
for(int i=ans.l-;i>=;i--) printf("%04d",ans.w[i]);printf("\n");
return ;
}
2017-04-20 15:29:03