题意:

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

思路:

  如果出现连续的8,9...个球同色,那么也必定含有7个同色。需要统计两部分,第一部分是将n个球看成一个序列,在不允许出现连续7个同色球的情况下,统计其可能出现的所有方案数。第二部分是,在第一部分中统计到的,有可能在一个圈的接口处可能出现超过6个球同色的,那么只需要再统计一下这一情况的方案数。问题在于这里。

  序列上肯定不会超过6个同色,所以环的头尾加起来最多有12个同色球,即序列前6个,序列后6个。但是如果n<=12的话,还不会出现环接口处12个同色的情况,需要分类讨论。假设n=8,那么最多可能出现7个同色(根据第一部分的假设),若n=9,最多可能出现8个同色....若n=13,最多可能出现12个同色。先假设序列A={7,8,9,10,11,12}。

  如何求第二部分?假如n=8,那么最多可能出现7个连色,那么就先假设前7个球都是黑色,剩下1个球,只能是白色了,所以方案数为1。但是前7个球可能是白色的,而剩下的1球是黑色的,这只需要将前面的方案数乘以2就行了。而这7个连色的球还可能在环上的不同位置出现,所以还得再乘以(13-7)。其他的大概也是这样推的,只是部分处理可能不同。

 //#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
#include <vector>
#include <iostream>
#define pii pair<int,int>
#define INF 0x7f3f3f3f
#define LL long long
#define ULL unsigned long long
using namespace std;
const double PI = acos(-1.0);
const int M=;
int cur, dp[][<<], ans[], up=<<, mod=<<; void DP(int n)
{
for(int i=; i<=n; i++)
{
ans[]=ans[i]=;
cur^=;
memset(dp[cur], , sizeof(dp[cur]));
for(int s=,t,v; s<up; s++)
{
v=dp[cur^][s];
t=(s&(mod-))<<; //取低5位 if(s+==up) //6黑
{
dp[cur][t]+=v;
ans[i]+=v; //只取白色结尾的
ans[]+=v;
}
else if(s==) //6白
{
dp[cur][t+]+=v;
ans[]+=v;
}
else
{
dp[cur][t]+=v;
dp[cur][t+]+=v;
ans[i]+=v;
ans[]+=v+v;
} dp[cur][t]%=M;
dp[cur][t+]%=M;
ans[i]%=M;
ans[]%=M;
}
}
} int cal(int n)
{
if(n<) return <<n;
if(n==) return ; memset(dp[cur=],,sizeof(dp[cur]));
dp[cur][up-]=; //默认前7个全黑,但是状态只记6位
DP(n);
int ans1=ans[]*%M, ans2=;
for(int k=; k<=; k++) //最多可能取到6+6=12个同颜色的
if(n-k>)
ans2=(ans2+ans[n-k]**(-k))%M; //枚举13-k个位置 return (ans1+M-ans2)%M;
} int main()
{
//freopen("input.txt","r",stdin);
int n, t, Case=;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("Case #%d: %d\n",++Case,cal(n));
}
return ;
}

AC代码

FZU 2204 7的更多相关文章

  1. fzu 2204 7 dp

    题目链接: fzu 2204 7 题目描述: 给出n个小球,每个小球只能涂黑色或者是白色,七个连续的不能是同种颜色,问有多少种涂色方法? 解题思路: 刚开始没有考虑到是环形的,WA的风生水起,怪我咯! ...

  2. FZU - 2204 简单环形dp

    FZU - 2204 简单环形dp 题目链接 n个有标号的球围成一个圈.每个球有两种颜色可以选择黑或白染色.问有多少种方案使得没有出现连续白球7个或连续黑球7个. 输入 第一行有多组数据.第一行T表示 ...

  3. FZU 2137 奇异字符串 后缀树组+RMQ

    题目连接:http://acm.fzu.edu.cn/problem.php?pid=2137 题解: 枚举x位置,向左右延伸计算答案 如何计算答案:对字符串建立SA,那么对于想双延伸的长度L,假如有 ...

  4. FZU 1914 单调队列

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...

  5. ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】

     FZU 2105  Digits Count Time Limit:10000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  6. FZU 2112 并查集、欧拉通路

    原题:http://acm.fzu.edu.cn/problem.php?pid=2112 首先是,票上没有提到的点是不需要去的. 然后我们先考虑这个图有几个连通分量,我们可以用一个并查集来维护,假设 ...

  7. ACM: FZU 2107 Hua Rong Dao - DFS - 暴力

    FZU 2107 Hua Rong Dao Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  8. ACM: FZU 2112 Tickets - 欧拉回路 - 并查集

     FZU 2112 Tickets Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u P ...

  9. ACM: FZU 2102 Solve equation - 手速题

     FZU 2102   Solve equation Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

随机推荐

  1. [51nod1065]最小正子段和

    题意:求一个序列中大于0的最小子段和. 解题关键: 先求出前缀和和,对于每个位置求某个位置到当前位置和大于1的和的最小值.然而这是复杂度是O(n^2)的.其实可以通过排序优化到O(nlogn).对前缀 ...

  2. linux命令配置IP详解

    在Linux系统中,TCP/IP网络是通过若干个文本文件进行配置的,有时需要编辑这些文件来完成联网工作. vi /etc/sysconfig/network-scripts/ifcfg-eth0 :进 ...

  3. QDUOJ ycb的ACM进阶之路 二进制多重背包

    ycb的ACM进阶之路 发布时间: 2017年5月22日 14:30   最后更新: 2017年5月22日 14:31   时间限制: 1000ms   内存限制: 128M 描述 ycb是个天资聪颖 ...

  4. linux 删除软链接

    Linux下取消软连接,做个案例来说明: 1.先建立一个软连接 ln -s /soft/hexo/nodejs/bin/node /usr/local/bin/node ln -s /soft/hex ...

  5. JAVA之动态编译

    通过Java动态生成class文件 今天说下JAVA中的动态编译,这个功能根据我现在的了解好像没有见到过用的,我Jio的吧,现在的一些在线代码编缉器可以用到了,这个具体我也不是很清楚.感兴趣的大家可以 ...

  6. Redis和springboot 整合redisUtil类

    一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  7. 将RegEx(正则表达式提取器)与JMeter一起使用

    JMeter的,最流行的开源性能测试工具,可以工作正则表达式,用正则表达式提取.正则表达式是一种用于通过使用高级操作提取文本的必需部分的工具.正则表达式在测试Web应用程序时很流行,因为它们可用于验证 ...

  8. 用jQuery开发插件详解

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  9. python进程之理论

    ********进程理论知识******** ****操作系统背景知识**** 顾名思义,进程及正在执行的一个过程,进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念, ...

  10. Linux —— GDB调试程序

    调试实现 在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件. 生成可执行文件命令: g+ ...