HDU2947Bicycle Puzzle(组合原理)

题目大意:

你和朋友两人玩游戏,将一个图片均等切割成W*
H块,打乱每一小块的位置。拼图游戏开始。每次,可以交换任意两块,记下交换的次数,图片还原游戏结束。得分为执行交换的次数。得分越小越好。

现在,给你W和H, 还有你朋友的得分S,问,你能够得到小于S分的概率。

解题思路:

首先,在考虑问题时,只和块数有关,所以,N = W * H, W和H可以无视之。

然后,用 P[N][K] 表示:图片被分割成 N 块,需要交换 K 次才能使图片还原 的情况数目。那么,我们再 加上一小块,也就是说,把图片分割成 N +
1 块。假如,新加入的第 N + 1 块 它就在正确的位置上,那么,使图片还原需要 K 次操作]; 假如,新加入的第 N + 1
块不在正确的位置上,那么,它必定和前面 N 块中的某一块交换了位置, 则要把图片还原,就需要 K + 1 次操作。

整理一下可以得到下面的递推式:

p[i][j] = p[i - 1][j] + p[i - 1][j - 1] * (i - 1)


 1 #include <iostream>
2 using namespace std;
3 __int64 p[21][21];
4 __int64 gcd(__int64 a, __int64 b)
5 {
6 return b ? gcd(b, a % b) : a;
7 }
8 void init()
9 {
10 int i, j;
11 for (i = 0; i <= 20; ++i)
12 {
13 p[i][0] = 1;
14 p[i][i] = 0;
15 }
16 for (i = 2; i <= 20; ++i)
17 for (j = 1; j < i; ++j)
18 p[i][j] = p[i - 1][j] + p[i - 1][j - 1] * (i - 1);
19 }
20 void solve(int s, int n)
21 {
22 __int64 sum = 0, total = 0 , g;
23 int i;
24 for (i = 0; i < s; ++i)
25 sum += p[n][i];
26 total = sum;
27 for ( ; i < n; ++i)
28 total += p[n][i];
29 g = gcd(sum, total);
30 sum /= g;
31 total /= g;
32 if (total == 1 && sum == 1)
33 printf("1\n");
34 else if (sum == 0)
35 printf("0\n");
36 else printf("%I64d/%I64d\n", sum, total);
37 }
38 int main()
39 {
40 init();
41 int tcase, w, h, n, s;
42 scanf("%d", &tcase);
43 while (tcase--)
44 {
45 scanf("%d%d%d", &w, &h, &s);
46 solve(s, w * h);
47 }
48 return 0;
49 }

HDU2947Bicycle Puzzle(组合原理)

时间: 2024-11-03 21:45:16

HDU2947Bicycle Puzzle(组合原理)的相关文章

UVa - 227 - Puzzle

给空格子上下左右的互换操作,问最后是怎样的 注意一行的最后一个若是空格,需要自己加注意读取时 操作可能分好多行,一定要读取到 0 为止 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 char map[50][50],op[1000],c,tmp; 5 int k,t,x,y,cnt; 6 bool flag; 7 void fuc() 8 { 9 flag=1; 10 for(int i=0;

HDU 5465 Clarke and puzzle Nim游戏+二维树状数组

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle Accepts: 42 Submissions: 269 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 克拉克是一名人格分裂患者.某一天,有两个克拉克(aa和bb)在玩一个方格游戏. 这个方格是一个n*mn∗m的矩阵,每个格子里有一

HDU 1098 Ignatius&#39;s puzzle 费马小定理+扩展欧几里德算法

题目大意: 给定k,找到一个满足的a使任意的x都满足 f(x)=5*x^13+13*x^5+k*a*x 被65整除 推证: f(x) = (5*x^12 + 13 * x^4 + ak) * x 因为x可以任意取 那么不能总是满足 65|x 那么必须是 65 | (5*x^12 + 13 * x^4 + ak) 那么就是说 x^12 / 13 + x^4 / 5 + ak / 65 正好是一个整数 假设能找到满足的a , 那么将 ak / 65 分进x^12 / 13 + x^4 / 5中得到

HDU 4708 Rotation Lock Puzzle (贪心+模拟)

Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1668    Accepted Submission(s): 530 Problem Description Alice was felling into a cave. She found a strange door with a number

Dearboy&#39;s Puzzle (poj 2308 搜索 dfs+bfs)

Language: Default Dearboy's Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1202   Accepted: 208 Description Dearboy is a game lover. Recently, he loves playing the game Lian Lian Kan. This game is played on a board with N*M grids

hduoj 4708 Rotation Lock Puzzle 2013 ACM/ICPC Asia Regional Online —— Warmup

http://acm.hdu.edu.cn/showproblem.php?pid=4708 Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description Alice was felling into a cave. She found a strange door with a number square m

Aizu 0121 Seven Puzzle (康托展开+bfs)

Seven Puzzle Time Limit : 1 sec, Memory Limit : 65536 KB 7パズルは8つの正方形のカードとこれらのカードがぴたりと収まる枠を使って行います.それぞれのカードは互いに区別できるように.0,1,2....7と番号がつけられています.枠には.縦に2個.横に4個のカードを並べることができます. 7パズルを始めるときには.まず枠にすべてのカードを入れます.枠のなかで0のカードだけは.上下左右に隣接するカードと位置を交換することができます.たとえば.枠

杭电1097-A hard puzzle

Problem Description lcy gives a hard puzzle to feng5166,lwg,JGShining and Ignatius: gave a and b,how to know the a^b.everybody objects to this BT problem,so lcy makes the problem easier than begin.this puzzle describes that: gave a and b,how to know

uva live 12846 A Daisy Puzzle Game

如果下一个状态有必败,那么此时状态一定是必胜,否则此时状态一定是必败 状压DP #include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include&