zoj3380 Patchouli's Spell Cards

2024-05-14 12:08
文章标签 spell cards patchouli zoj3380

本文主要是介绍zoj3380 Patchouli's Spell Cards,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Patchouli's Spell Cards

Time Limit: 7 Seconds Memory Limit: 65536 KB

Patchouli Knowledge, the unmoving great library, is a magician who has settled down in the Scarlet Devil Mansion (紅魔館). Her specialty is elemental magic employing the seven elements fire, water, wood, metal, earth, sun, and moon. So she can cast different spell cards like Water Sign "Princess Undine", Moon Sign "Silent Selene" and Sun Sign "Royal Flare". In addition, she can combine the elements as well. So she can also cast high-level spell cards like Metal & Water Sign "Mercury Poison" and Fire, Water, Wood, Metal & Earth Sign "Philosopher's Stones" .

Assume that there are m different elements in total, each element has n different phase. Patchouli can use many different elements in a single spell card, as long as these elements have the same phases. The level of a spell card is determined by the number of different elements used in it. When Patchouli is going to have a fight, she will choose m different elements, each of which will have a random phase with the same probability. What's the probability that she can cast a spell card of which the level is no less than l, namely a spell card using at least l different elements.

Input

There are multiple cases. Each case contains three integers 1 ≤ m, n, l ≤ 100. Process to the end of file.

Output

For each case, output the probability as irreducible fraction. If it is impossible, output "mukyu~" instead.

Sample Input
7 6 5
7 7 7
7 8 9
Sample Output
187/15552
1/117649
mukyu~
当l>m明显无解,l>m/2,可直接用组合数求出,当l<=m/2,这里就不能用组合数求了,因为,这里会有重复,用dp[i][j]表示前i个数字,第j位,满足某个数字小于l的个数,那么我们可以得出dp[i][j]=dp[i][j-k]c[m-j+k][k],也就是第i个数字,可以放1-k个位置,这样就可以得出答案了!
import java.math.BigInteger;
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner a=new Scanner(System.in);int M=150;BigInteger dp[][]=new  BigInteger[150][150];BigInteger an[][]=new  BigInteger[150][150];BigInteger one ,zero;one=BigInteger.ONE;zero=BigInteger.ZERO;for(int i=0;i<120;i++){dp[i][i]=dp[i][0]=dp[0][i]=one;for(int j=1;j<i;j++){dp[i][j]=dp[i-1][j-1].add(dp[i-1][j]);}}while(a.hasNext()){int m,n,l;BigInteger ans,nn,mm,ll,all,gcd;m=a.nextInt();n=a.nextInt();l=a.nextInt();nn=BigInteger.valueOf(n);mm=BigInteger.valueOf(m);ll=BigInteger.valueOf(l);ans=nn.pow(m);if(l>m){System.out.print("mukyu~\n");continue;}if(l>m/2){all=zero;for(int i=l;i<=m;i++){all=all.add(dp[m][i].multiply(BigInteger.valueOf(n-1).pow(m-i)));}all=BigInteger.valueOf(n).multiply(all);gcd=ans.gcd(all);System.out.println(all.divide(gcd)+"/"+ans.divide(gcd));continue;}for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)an[i][j]=zero;an[0][0]=one;	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){for(int k=0;k<=j&&k<l;k++){an[i][j]=an[i][j].add(an[i-1][j-k].multiply(dp[m-j+k][k]));}}all=zero;for(int i=1;i<=n;i++){all=all.add(an[i][m]);}all=ans.subtract(all);gcd=ans.gcd(all);System.out.println(all.divide(gcd)+"/"+ans.divide(gcd));}}}


这篇关于zoj3380 Patchouli's Spell Cards的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988713

相关文章

poj 1511 Invitation Cards(spfa最短路)

题意是给你点与点之间的距离,求来回到点1的最短路中的边权和。 因为边很大,不能用原来的dijkstra什么的,所以用spfa来做。并且注意要用long long int 来存储。 稍微改了一下学长的模板。 stack stl 实现代码: #include<stdio.h>#include<stack>using namespace std;const int M

【HDU】4876 ZCC loves cards 暴力

传送门:【HDU】4876 ZCC loves cards 题目分析: 这题无力吐嘈。。。。能想到的优化都用上吧。。。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , n ) for ( int i =

Python 中的 spell checker 库

Python 中的 spell checker 库 在日常生活中,我们经常遇到文本中的错误,如 misspelled words、typos 等。为了解决这些问题,我们可以使用 spell checker 库来检测和纠正文本中的错误。Python 提供了多种 spell checker 库,下面我们将介绍其中的一些库,并结合实例来演示它们的使用。 1. PyEnchant PyEnchant

poj 1721 CARDS(置换)

http://poj.org/problem?id=1721 大致题意:原始序列通过洗牌机洗牌s次后变为当前序列,已知当前序列,求原始序列。 在置换群快速幂运算 研究与探讨中最后有详解,有两种解法,一种是求出置换的长度a(即一副牌洗a次后变回原来的位置),现已知原始序列置换s次变为当前序列,那么当前序列再置换a-s次就是原始序列了。求a就是直接模拟每个置换的过程,直到某序列与当前序

题解:P3569 [POI2014] KAR-Cards

题意 有 n n n 个元素,第 i i i 个元素有两个权值 a i a_i ai​ 和 b i b_i bi​;有 m m m 次操作,每次操作会交换两个元素的位置,且都需要回答:是否存在一种方案,使得每个元素各选择一个权值后,组成的序列从左到右单调不降。 解法 完全可以把交换操作看作两次单点修改,每次只需要考虑一个元素的变化对答案的影响即可。对于一个区间中的元素,显然开

[LightOJ 1364] Expected Cards (高维期望DP)

LightOJ - 1364 一副扑克牌,不断地从中抽牌 要求四种花色都至少要有给定的张数 其中如果抽到了王牌,可以将其变为任意花色 求满足条件时,抽出的期望张数 刚开始想错了,两张王牌并非在一开始就给定了 而是在游戏中可以视当前情况选择着变的 这两种方式是不一样的 由于牌数其实并不会很多, 复杂度乘一乘发现才 107 10^7级别的,所以直接暴力DP 将两张王牌当

【PAT】【Advanced Level】1005. Spell It Right (20)

1005. Spell It Right (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given a non-negative integer N, your task is to compute the sum of all the

Leetcode 3186. Maximum Total Damage With Spell Casting

Leetcode 3186. Maximum Total Damage With Spell Casting 1. 解题思路2. 代码实现 题目链接:3186. Maximum Total Damage With Spell Casting 1. 解题思路 这一题就是一个简单的动态规划的题目,我们只需要考虑每一个位置上的元素取或者不取即可: 如果不取,直接考察下一个元素即可;如果取,考察能

HDU 1535 Invitation Cards 2次Dijkstra来回最短路

题目来源:HDU 1535 Invitation Cards 题意:从1派学生到2-n这n-1个点  求去并且回来的最短路 就是1到各点的最短路之和和各点到1的最短路之和 给的是有向图 思路:对于1到各个点的最短路直接Dijkstra求出无压力 然后各个点到1的最短路可以反向建图后再求一次从1到各个点的最短路 对于很多点到一个点的情况可以考虑反向建图 转变成单源最短路 #include <

Codefores 398A Cards(贪心+暴力)

题目链接:Codefores 398A Cards 题目大意:给出a和b,表示说有a个“o”的卡和b个“x”的卡,将这a+b个卡片排成一个序列,每连续的k个相同的卡片为一个数,表示k^2,如果是o,则是+k^2,否则-k^2。要求找到一个序列使得最后的结果尽量大。 解题思路:一开始一直想用贪心的思想直接构造出来,后来和小伙伴一人想了一种构造方法,但是又互相推翻了。。。。不过很快就想