zoukankan      html  css  js  c++  java
  • fzu2204 7

     Problem Description

    n个有标号的球围成一个圈。每个球有两种颜色可以选择黑或白染色。问有多少种方案使得没有出现连续白球7个或连续黑球7个。

     Input

    第一行有多组数据。第一行T表示组数。(T <= 20)

    每组包含n,表示球的个数。(1 <= n <= 100000)

     Output

    每组先输出 "Case #x: " (其中x为当前组数) 该行接下来输出方案数。方案数mod 2015。

     Sample Input

    271

     Sample Output

    Case #1: 126Case #2: 2

     Source

    FOJ有奖月赛-2015年10月


    这道题可以用dp做,用dp[i][j][k]表示前i个球中,末尾连续j个白球,连续k个黑球的方案数,那么跟fzu2200那题一样,因为是环,所以我们可以枚举开始的状态(即开始有多少个黑球连续,这里我们只要考虑有几个黑球就行,因为是对称的,所以最后答案只要乘2就行了),然后每一步枚举取白球还是黑球,状态转移一下就行了。


    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<string>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    #define inf 0x7fffffff
    #define maxn 100050
    #define MOD 2015
    ll dp[maxn][7][7],rear[maxn];
    void init()
    {
        int i,j,k,ii,jj;
        memset(rear,0,sizeof(rear));
        for(k=1;k<=6;k++){
            memset(dp,0,sizeof(dp));
            dp[k+1][1][0]=1;
            for(i=k+1;i<=100020;i++){
                //放黑球
                for(ii=1;ii<=6;ii++){
                    dp[i][0][1]=(dp[i][0][1]+dp[i-1][ii][0])%MOD;
                }
                for(ii=1;ii<=5;ii++){
                    dp[i][0][ii+1]=(dp[i][0][ii+1]+dp[i-1][0][ii])%MOD;
                }
                //放白球
                for(ii=1;ii<=6;ii++){
                    dp[i][1][0]=(dp[i][1][0]+dp[i-1][0][ii])%MOD;
                }
                for(ii=1;ii<=5;ii++){
                    dp[i][ii+1][0]=(dp[i][ii+1][0]+dp[i-1][ii][0])%MOD;
                }
                
                //加入到答案中
                for(ii=1;ii<=6;ii++){
                    rear[i]=(rear[i]+dp[i][ii][0])%MOD;
                }
                for(ii=1;ii+k<7;ii++){
                    rear[i]=(rear[i]+dp[i][0][ii])%MOD;
                }
    
    
            }
    
    
    
        }
    
    
    
    }
    
    
    int main()
    {
        int n,m,i,j,T,cas=0;
        init();
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            cas++;
            printf("Case #%d: ",cas);
            if(n<=6){
                int ans=1;
                for(i=1;i<=n;i++)ans*=2;
                printf("%d
    ",ans);
                continue;
            }
            printf("%I64d
    ",rear[n]*2%MOD);
        }
        return 0;
    }
    


  • 相关阅读:
    转(一万小时定律的文章): const 与 readonly区别...
    项目中报错邮件方法
    Windows Phone(一) 正式开发之前的准备资料(主要注册开发者账号,手机解锁,激活码,程序部署)
    转(ASP.NET页面缓存)
    部署XAP时,部署工具提示部署无效,求解决!
    jQuery 1
    DOMform
    jQuery 2 一些常用的函数
    jQuery 6 层次选择器
    jQuery 3 对象转换
  • 原文地址:https://www.cnblogs.com/herumw/p/9464636.html
Copyright © 2011-2022 走看看