【CSP-S膜你考】我们的可可西里

我们的可可西里

题面

转眼到了2008年的6月9日,盼望已久的高考结束了。我们踏上了向西的旅程(本来是想写西去之路,可是考虑不太妥当)。可可西里,多么诱人的名词,充满了奇幻的色彩和自然的淳朴。从可可西里徒步走回家的决定是在1年半前定下的,而现在,终于可以实现那个钩过手指的预定。我们的可可西里。。。

在回家的路上,疯子和蚊子看到了许多可爱的藏羚羊,无意之中疯子和蚊子发现藏羚羊的居住地的分布也是有规律的,虽然疯子和蚊子早就听说藏羚羊是一种群体性很强又有超高IQ的动物,但是还是为它们的居住地分布规律感到惊叹。经过细心的观察,疯子和蚊子发现,如果假设一个藏羚羊群体有N只羊,就可以把它们的领地当做一个N*N的方阵,在这个方阵上第I列的第I 行都有一个圣地,它们不会居住在圣地,同时每行每列只能居住一只羚羊。于是他们很快算出一个有N只羊的藏羚羊群体的居住地分布方法数。

这是圣地的一种排列方法

输入格式

一个整数N 代表藏羚羊的个数

输出格式

一个整数sum代表方法数

样例

\(\texttt{input\#1}\)
4

\(\texttt{output\#1}\)
9

数据范围与提示

对于30%的数据,n<=10
对于全部数据 n<=1000


题解

错排。高精度(毒瘤)。


\(Code\)

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>

int n;
std::string f[1001]={"0","0","1","2"};

inline std::string jia(std::string a,std::string b) {
    std::string ans="",cheng1="",cheng2="";
    int len=a.length();
    for(int i=len-1;i>=0;--i) cheng1+=a[i];
    len=b.length();
    for(int i=len-1;i>=0;--i) cheng2+=b[i];
    int len1=cheng1.length(),len2=cheng2.length();
    int sum=0;
    char jinwei=0,c1,c2;
    while(sum<len1||sum<len2) {
        c1=cheng1[sum]-48;
        c2=cheng2[sum]-48;
        if(c1<0) c1=0;
        if(c2<0) c2=0;
        if(sum>=len1) c1=0;
        if(sum>=len2) c2=0;
        c1+=c2;
        c1+=jinwei;
        jinwei=0;
        if(c1>9) {
            jinwei=c1/10;
            c1=c1%10;
        }
        ans+=c1+'0';
        sum++;
    }
    while(jinwei!=0) {
        char qwq=jinwei/10;
        jinwei=jinwei%10;
        ans+=jinwei+'0';
        jinwei=qwq;
    }
    std::string anss="";
    len=ans.length();
    for(int i=len-1;i>=0;--i) anss+=ans[i];
    return anss;
}

inline std::string cheng(int n,std::string a) {
    std::string ans="",cheng1="",cheng2="";
    while(n) {
        cheng1+=n%10+'0';
        n/=10;
    }
    int len=a.length();
    for(int i=len-1;i>=0;--i) cheng2+=a[i];
    int len1=cheng1.length(),len2=cheng2.length();
    std::string qwq="0",qaq="",emm="";
    char jinwei=0;
    for(int i=0;i<len1;++i) {
        qaq="",emm="";
        int x=i;
        while(x) {
            --x;
            qaq+='0';
        }
        for(int j=0;j<len2;++j) {
            char c2=cheng2[j]-'0',c1=cheng1[i]-'0';
            c1*=c2;
            c1+=jinwei;
            jinwei=0;
            if(c1>9) {
                jinwei=c1/10;
                c1%=10;
            }
            qaq+=c1+'0';
        }
        while(jinwei!=0) {
            char wasd=jinwei/10;
            jinwei%=10;
            qaq+=jinwei+'0';
            jinwei=wasd;
        }
        int len=qaq.length();
        for(int j=len-1;j>=0;--j) emm+=qaq[j];
        qwq=jia(qwq,emm);
    }
    return qwq;
}

inline std::string jiaqwq(std::string qaq) {
    int len=qaq.length();
    std::string ans="",qwq="";
    char jinwei=1;
    for(int i=len-1;i>=0;--i) {
        qaq[i]-='0';
        qaq[i]+=jinwei;
        jinwei=0;
        ans+=qaq[i]%10+'0';
        if(qaq[i]>9) jinwei=qaq[i]/10;
    }
    len=ans.length();
    for(int i=len-1;i>=0;--i) qwq+=ans[i];
    return qwq;
}

int main() {
    std::cin>>n;
    for(int i=4;i<=n;++i) {
        std::string qwq=jia(f[i-1],f[i-2]);
        f[i]=cheng(i-1,qwq);
    }
    std::cout<<f[n];
    return 0;
}

上接【CSP-S膜你考】那23个路口

posted @ 2019-10-21 14:34  yu__xuan  阅读(...)  评论(...编辑  收藏