2017 10 10 模拟赛T1

初次见面(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;
}

 

posted @ 2017-10-10 13:56  Excim  阅读(116)  评论(0编辑  收藏  举报