您的位置:首页 > 其它

【BZOJ1005】【HNOI2008】明明的烦恼

2016-09-27 18:10 302 查看
又是看黄学长的代码写的,估计我的整个BZOJ平推计划都要看黄学长的代码写

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int mo=100000;
int n,a[1100];
int m=0,tot=0;
int zhi[110000],ztop=0;
bool kang[510000];
int num[110000];
int ans[1100000],la=0;
void shai(){
memset(kang,0,sizeof(kang));
for(int i=2;i<=500000;i++)if(!kang[i]){
zhi[++ztop]=i;
int temp=2;
while(i*temp<=500000){
kang[i*temp]=true;
temp++;
}
}
}
void buff(int x,int y){//hzwer_orz,用一个参数可以将加和减的代码合并
for(int i=1;i<=x;i++){//阶乘
int c=i;
for(int j=1;c>=zhi[j];j++)
while(!(c%zhi[j])){
num[j]+=y;
c/=zhi[j];
}
}
}
void mul(int x){
for(int i=1;i<=la;i++)  ans[i]*=x;
for(int i=1;i<=la;i++){
ans[i+1]+=ans[i]/mo;
ans[i]%=mo;
}
while(ans[la+1]){  la++;  ans[la+1]+=ans[la]/mo;  ans[la]%=mo;}
}
int main(){
//freopen("ddd.in","r",stdin);
//freopen("bzoj_1005.in","r",stdin);
//freopen("bzoj_1005.out","w",stdout);
memset(num,0,sizeof(num));
shai();
cin>>n;
if(n==1){
scanf("%d",&a[1]);//注意因为a要--,所以这个特判不能放下面
if(!a[1] || a[1]==-1)  cout<<1<<endl;
else  cout<<0<<endl;
return 0;
}
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(!a[i]){  cout<<0<<endl;  return 0;}
if(a[i]==-1)  m++;
else  a[i]--,tot+=a[i];
}
buff(n-2,1);
buff(n-2-tot,-1);
for(int i=1;i<=n;i++)if(a[i])  buff(a[i],-1);
ans[la=1]=1;
for(int i=1;i<=ztop;i++)
while(num[i] --> 0)//趋向于
//mul(num[i]);静态差错多重要?这是第二个傻逼错误了
mul(zhi[i]);
for(int i=1;i<=n-2-tot;i++)
mul(m);
//for(int i=1;i<=la;i++)  cout<<ans[i]<<" ";  cout<<endl;
cout<<ans[la];//之前写成最后输出ans[1]  qaq
for(int i=la-1;i>=1;i--)  printf("%05d",ans[i]);//之前写成2到la了,实力会随着时间的推移而降低qaq,然后还是之前写成%04 qaq
cout<<endl;
//因为高精度乘WA了5次QAQ
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: