初次见面(firstmeet)
一段很一颗赛艇的题目背景:
雾之湖边,静得可怕。
露米娅出神凝望。黑白连衣裙,像极了绽放的墨黑和洁白的莲。身边的雾之
湖,倒映着血色天空。酒红的双眸,映照一切。低声浅笑,双臂伸直,她悄无声
息地没入一抹黑暗中,纵身一跃,便穿梭在无尽的苍穹之下。 漆黑,在她的身
影上缠绕,蔓延...... 空中,红白的巫女灵梦正在低低的飞着,享受着清爽的微风。
突然,灵梦的速度放缓,笑意渐渐凝固——灵梦与露米娅就此见面。
灵梦瞳孔骤缩,那嗜血的笑容,无力的啜泣,血红染满的双手,欣慰却又毫
无生机的微笑......一系列画面先潮水般涌入她的脑海,进而又碎得无影无踪。
无助,失落,灵梦攥紧双拳,想要留下些什么,却又真的无能为力。终于,
她厉声向对面喊道:“这红雾是你放的吧!?”话语未落便祭出阴阳玉,摆出阵
法,绚丽的弹幕旋即铺天盖地地扎了过去。
问题描述:
此次灵梦发动的阵法可以看做是一个n*n 的矩阵,阵法的每行都有一个阴阳
玉,矩阵的其余位置为空,保证任意两个阴阳玉不在同一行,不在同一列,想要
成功发动阵法,灵梦必须在阵法中放置n 张符纸。符纸的放置需满足以下要求:
1.有阴阳玉的地方不能放置符纸;
2.每行只能有一张符纸;
3.每列只能有一张符纸。
在满足上述要求下,符纸放置的方案数就为此次阵法的攻击力,求灵梦此次
阵法的攻击力为多少。
输入格式:
第一行一个数n,接下来n行,每行n个数,一个0或一个1
输出格式:
一个数,阵法的最大攻击力。
数据范围:对于100%的数据,n<=5000
由于此题与斜线无关,所以可以将各行交换,将所有的1都聚集在对角线上,于是这就成为错排问题,使用递推高精求和即可。
此题来自HAOI2016,不过原题的数据范围只有2000,高精不压位也可以过,但是。这道题的数据范围有5000,最后答案数加起来可能有15000位左右,有可能超时,所以用压位优化(不知道算不算优化)一下。
#include<cstdio> int n,c[20005],b[20005],a[20005],s=1,t; int main() { // freopen("firstmeet.in","r",stdin); // freopen("firstmeet.out","w",stdout); scanf("%d",&n); if(n==1) { printf("0"); return 0; } a[1]=1; for(int i=2;i<n;i++) { for(int j=1;j<=s;j++) { c[j]=a[j]; a[j]+=b[j]; b[j]=c[j]; a[j]*=i; } for(int j=1;j<s;j++) { if(a[j]>=10000) { a[j+1]+=a[j]/10000; a[j]%=10000; } } while(a[s]>=10000) { a[s+1]+=a[s]/10000; a[s]%=10000; s++; } } printf("%d",a[s]); for(int i=s-1;i>=1;i--) { if(a[i]<1000) printf("0"); if(a[i]<100) printf("0"); if(a[i]<10) printf("0"); printf("%d",a[i]); } return 0; }