bzoj 2281: [Sdoi2011]黑白棋

再次,,,,,虚(一开始看错题了,看成一次移动一个棋子,能移动1-d个格子。。。这样的话有没有大神会做??本蒟蒻就教)

额,,直接%%%%把。。。http://hzwer.com/5760.html

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<map>
 5 #include<queue>
 6 #define N 1000005
 7 #define inf 1000000000
 8 #define LL long long
 9 using namespace std;
10 const LL mod=1e9+7;
11 LL tot,ans;
12 int n,K,d,p;
13 LL bin[25];
14 LL c[10005][205],f[25][10005];
15 void pre()
16 {
17     for (int i=0; i<=n; i++) c[i][0]=1;
18     for (int i=1; i<=n; i++)
19         for (int j=1; j<=min(2*K,i); j++)
20             c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
21 }
22 int C(int x, int y)
23 {
24     if (y>x-y) y=x-y;
25     return c[x][y];
26 }
27 void add(LL &x, LL y)
28 {
29     x=(x+y)%mod;
30 }
31 int main()
32 {
33     bin[0]=1; for (int i=1; i<=15; i++) bin[i]=bin[i-1]<<1;
34     scanf("%d %d %d",&n,&K,&d); K/=2; pre(); f[0][0]=1;
35     for (int i=0; i<15; i++)
36         for (int j=0; j<=n-2*K; j++)
37             for (int k=0; k*(d+1)<=K && j+(d+1)*k*bin[i]<=n-2*K; k++)
38             {
39                 add(f[i+1][j+k*(d+1)*bin[i]],f[i][j]*C(K,k*(d+1)));
40             }
41     for (int i=0; i<=n-2*K; i++)
42         add(ans,f[15][i]*C(n-i-K,K));
43     tot=C(n,K*2);
44     cout<<(tot+mod-ans)%mod;
45     return 0;
46 }
时间: 2024-10-24 17:28:57

bzoj 2281: [Sdoi2011]黑白棋的相关文章

[Sdoi2011]黑白棋 题解

2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 592  Solved: 362[Submit][Status][Discuss] Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小A可以移动白色棋子,小B可以移动黑色的棋子,他们每次操作可以移动1到d个棋子. 每

[BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)

2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 626  Solved: 390[Submit][Status][Discuss] Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小A可以移动白色棋子,小B可以移动黑色的棋子,他们每次操作可以移动1到d个棋子. 每

【bzoj2281】 Sdoi2011—黑白棋

http://www.lydsy.com/JudgeOnline/problem.php?id=2281 (题目链接) 题意 一个1*n的棋盘,棋盘上一个隔一个的放着个黑棋和白棋,最左端是白棋,最右端是黑棋每次可以向左或向右移动<=d颗棋子,移动不能跨越棋子,也不能越出边界,问先手必胜的初始状态有多少. Solution Knim. 右转介绍:http://blog.csdn.net/weixinding/article/details/7321139 左转题解:http://blog.csdn

[SDOI2011]黑白棋

题目描述 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小A可以移动白色棋子,小B可以移动黑色的棋子,他们每次操作可以移动1到d个棋子. 每当移动某一个棋子时,这个棋子不能跨越两边的棋子,当然也不可以出界.当谁不可以操作时,谁就失败了. 小A和小B轮流操作,现在小A先移动,有多少种初始棋子的布局会使他胜利呢? 输入输出格式 输入格式: 共一行,三个数,n,k,d. 输出

【bzoj2281】[Sdoi2011]黑白棋

博弈论---Nimk问题. dp再搞搞. 很容易看出,该游戏的终态是每两个棋子都紧靠着.当一颗棋子移动,另一方与该棋子对应的那一刻可以立即追上,使得仍旧紧靠,最终棋子动弹不得,游戏结束. 还能看出,对于白色棋子(先手),往左走没有意义.因为黑子(后手)可以紧随其上使得两者距离不变.同理黑子只往左走.(黄学长貌似提出了反例?) 所以,问题可以抽象为Nim,与传统Nim只能选1堆不同,你可以选1-d堆. 这个拓展问题叫做Nimk问题.对于这种问题,我们可以证明:当将n堆棋子化为二进制,每一位上如果1

BZOJ 2243: [SDOI2011]染色 树链剖分

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1886  Solved: 752[Submit][Status] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”.“222”和“1”. 请你写一个程序依次完成这m个操作. In

游戏开发(三)——WIN32 黑白棋(三)——游戏画面的现实

整个游戏分3部分介绍. 1.棋局的现实 2.AI的现实 3.游戏画面的现实 提供一下完整项目下载 这是第三部分:画面的显示 这部分其实就比较简单的,说白了就是api的堆砌. 主要了解下windows的消息机制,以及怎么画图 主要是分别封装了下对棋盘,棋子,以及当前轮到谁,当前比分是多少,就是游戏画面上不同的部分的绘制. void DrawReversiBoard(); void DrawReversiPieces(EnumReversiPiecesType type, int row_y, in

人机对战-黑白棋

先大致了解一下黑白棋: 规则 如果玩家在棋盘上没有地方可以下子,则该玩家对手可以连下.双方都没有棋子可以下时棋局结束,以棋子数目来计算胜负,棋子多的一方获胜. 在棋盘还没有下满时,如果一方的棋子已经被对方吃光,则棋局也结束.将对手棋子吃光的一方获胜. 翻转棋类似于棋盘游戏"奥赛罗 (Othello)",是一种得分会戏剧性变化并且需要长时间思考的策略性游戏. 翻转棋的棋盘上有 64 个可以放置黑白棋子的方格(类似于国际象棋和跳棋).游戏的目标是使棋盘上自己颜色的棋子数超过对手的棋子数.

黑白棋游戏 (codevs 2743)题解

[问题描述] 黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋子,共有8枚白棋子和8枚黑棋子.这16枚棋子的每一种放置方案都构成一个游戏状态.在棋盘上拥有1条公共边的2个方格称为相邻方格.一个方格最多可有4个相邻方格.在玩黑白棋游戏时,每一步可将任何2个相邻方格中棋子互换位置.对于给定的初始游戏状态和目标游戏状态,编程计算从初始游戏状态变化到目标游戏状态的最短着棋序列. [样例输入] 1111 0000 1110 0010 1010 0101 1010 0101 [样例输出] 4