codeforces #309 div2

来源:互联网 发布:知止阅读出题 编辑:程序博客网 时间:2024/05/29 09:32

A,B 题都是傻逼题,E 题不会。。。


C 题:
显然是个数学题,对于第 i 种颜色的处理,
可以视为将第 i 种颜色的球中取出ci1个插入之前的序列中,
另外1个放在整个序列最后,那么方案数就是C(si1,ci1)

ans=ni=1C(si1,ci1)


D 题:
显然也是个数学题,每个置换环用最大表示法表示,而置换环又按从小到大排列。
所以只会出现长度为 12 的置换环。


fi 为在长度为 i 的序列中,出现长度为 2 置换环的方案数。
f1=0 , f2=1 , f3=2fi=fi1+fi2 | i>=4


这样我们就可以知道后面的序列还有多少种方案可行,
gi 为确定了前 i 位,第 i+1 ~ n 位的可行方案数。
gi=fni+1+1,然后逐位确定序列。



#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>const int maxn = 1005, Mod = 1e9+7;int n, c[maxn], tot, max;int g[maxn][maxn];long long ans = 1;int main(){#ifndef ONLINE_JUDGE        freopen("C.in","r",stdin);    freopen("C.out","w",stdout);#endif    std::cin >> n;    for(int i = 1; i <= n; i++)    {        std::cin >> c[i], tot += c[i];        max = std::max(max, c[i]);    }    for(int i = 0; i <= tot; i++)        g[i][0] = 1;    for(int i = 1; i <= tot; i++)        for(int j = 1; j < max; j++)             g[i][j] = (g[i-1][j-1]+g[i-1][j])%Mod;    for(int i = 1, sum = 0; i <= n; i++)    {        sum += c[i];        ans *= g[sum-1][c[i]-1];        ans %= Mod;    }    std::cout << ans;#ifndef ONLINE_JUDGE    fclose(stdin);    fclose(stdout);#endif    return 0;       }

#include<cstdio>#include<cstdlib>#include<ctime>#include<cmath>#include<cstring>#include<map>#include<string>#include<stack>#include<queue>#include<utility>#include<iostream>#include<algorithm>const int maxn = 55;long long f[maxn];int n; long long k;int main(){#ifndef ONLINE_JUDGE    freopen("D.in","r",stdin);    freopen("D.out","w",stdout);#endif    std::cin >> n >> k;    f[1] = f[2] = 1;    for(int i = 3; i <= n; i++)         f[i] = f[i-1] + f[i-2];    for(int i = 1; i <= n; i++)    {        if(k > f[n-i+1] && i < n)        {            k -= f[n-i+1];            std::cout << i+1 << ' ';            std::cout << i++ << ' ';        }        else            std::cout << i << ' ';      }#ifndef ONLINE_JUDGE    fclose(stdin);    fclose(stdout);#endif    return 0;}
0 0
原创粉丝点击