zoj 3841 Cards
题意:给你52张牌,已知一个牌的序列,然后利用剩余的牌,能排成多少个序列,这个序列比已知的序列字典序小。
思路:从左到右尽可能放比已知序列相应位置小,找不到就放一样,然后求组合数就可以。多重集排列定理:令s时一个多重集,有k个不同类型的元素,各元素的重数分别为n1,n2......nk,令s的大小为n=n1+n2+......nk,则s的排列数为 n!/(n1!*n2!.....nk!);
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#define ll long long
#define maxn 100010
using namespace std;
const int mod=; char str[maxn];
int num[maxn];
ll f[maxn];
map<char,int>q; void inti()
{
f[]=;
for(int i=; i<=; i++)
f[i]=(f[i-]*i)%mod;
q['A']=;
for(int i=; i<=; i++)
q[''+i]=i;
q['']=;
q['J']=;
q['Q']=;
q['K']=;
} ll mult_mod(ll a,ll b,ll c)
{
a%=c;
b%=c;
ll ret=;
ll tmp=a;
while(b)
{
if(b&)
{
ret+=tmp;
if(ret>c) ret-=c;
}
tmp<<=;
if(tmp>c) tmp-=c;
b>>=;
}
return ret;
} ll pow_mod(ll a,ll n)
{
ll ret=;
ll temp=a%mod;
while(n)
{
if(n&)
{
ret=(ret*temp)%mod;
}
temp=(temp*temp)%mod;
n>>=;
}
return ret;
}
int main()
{
inti();
while(scanf("%s",str)!=EOF)
{
int k=strlen(str);
for(int i=; i<=; i++)
{
num[i]=;
}
int cnt=;
for(int i=; i<k; i++)
{
num[q[str[i]]]--;
cnt--;
if(str[i]=='') i++;
}
ll ans=;
int m=cnt;
bool flag=false;
for(int i=; i<k; i++)
{
if(cnt==) break;
for(int j=; j<=; j++)
{
if(num[j]>&&j<q[str[i]])
{
ll x=f[cnt-];
ll y=;
for(int c=; c<=; c++)
{
if(c==j)
{
y=(y*f[num[c]-])%mod;
continue;
}
y=(y*f[num[c]])%mod;
}
x=(x*pow_mod(y,mod-))%mod;
ans=(ans+x)%mod;
}
}
if(num[q[str[i]]]==)
{
flag=true;
break;
}
num[q[str[i]]]--;
cnt--;
if(str[i]=='') i++;
}
if(!flag&&m<-m)
ans=(ans+)%mod;
printf("%lld\n",ans);
}
return ;
}
zoj 3841 Cards的更多相关文章
- POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)
POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...
- zoj 2734 Exchange Cards【dfs+剪枝】
Exchange Cards Time Limit: 2 Seconds Memory Limit: 65536 KB As a basketball fan, Mike is also f ...
- POJ 1511 Invitation Cards (ZOJ 2008) 使用优先队列的dijkstra
传送门: http://poj.org/problem?id=1511 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1008 ...
- 【ZOJ】3380 Patchouli's Spell Cards
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3957 题意:m个位置,每个位置填1~n的数,求至少有L个位置的数一样的概率(1 ...
- zoj 3380 Patchouli's Spell Cards 概率DP
题意:1-n个位置中,每个位置填一个数,问至少有l个数是相同的概率. 可以转化求最多有l-1个数是相同的. dp[i][j]表示前i个位置填充j个位置的方案数,并且要满足上面的条件. 则: dp[i] ...
- ZOJ 2852 Deck of Cards DP
题意: 一一个21点游戏. 1. 有三个牌堆,分别为1X,2X,3X. 2. 纸牌A的值为1,纸牌2-9的值与牌面面相同,10(T).J.Q.K的值为10,而而joke(F)的值为 任意大大. 3. ...
- Deck of Cards ZOJ - 2852 dp 多决策 三维 滚动更新
题意:一个特殊21点游戏 具体http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2852 题解:建一个三维dp,表示三个卡槽分别 ...
- ZOJ 3380 Patchouli's Spell Cards
方案数,$dp$. 总的方案数有$n^m$种,符合要求的直接算不好算,可以算反面,即不符合要求的. 设$dp[i][j]$表示前$i$种等级填了$j$个位置,那么$dp[i][j]=sum(dp[i- ...
- 重拾ZOJ 一周解题
ZOJ 2734 Exchange Cards 题目大意: 给定一个值N,以及一堆卡片,每种卡片有一个值value和数量number.求使用任意张卡片组成N的方式. 例如N = 10 ,cards(1 ...
随机推荐
- AndroidManifest.xml解释说明和android的启动过程
1.android清单文件:AndroidManifest.xml 说明如下: <?xml version="1.0" encoding="utf-8"? ...
- JDBC-简单的学生管理系统-增删改查
结构:三层架构--mvc 三层是为了解决整个应用程序中各个业务操作过程中不同阶段的代码封装的问题,为了使程序员更加专注的处理某阶段的业务逻辑. 比如将数据库操作代码封装到一层中,提供一些方法根据参数直 ...
- Tomcat 的 SSL 配置
本教程使用 JDK 6 和 Tomcat 7,其他版本类似. 基本步骤: 使用 java 创建一个 keystore 文件 配置 Tomcat 以使用该 keystore 文件 测试 配置应用以便使用 ...
- 调试php的soapCient
try { import('@.Ext.xml'); header("Content-Type:text/html; charset=utf-8"); $soap = new So ...
- WEB 开发工具分享
有好用的工具 : 云盘链接地址:
- PHP 数组的值插入
曾今写过一个坑货的数组方法 function array_insert($myarray,$value,$position=0) { $fore=($position==0)?array():a ...
- WisDom.Net 框架设计(六) license
WisDom.Net-license 1.为啥要用license license (许可证) 顾名思义就是说我的软件只能给在指定的机器上使用.毕竟很多项目都不是免费的,(说句题外话,其实我用的也 ...
- 设计webapp的新思路
一般设计移动应用有3中方式:原生.脚本.混合:今天我们用另一种方式实现. 我叫它:响应式网页webApp 一.具体构架思路是这样的: 客户端:Android手机 Android手机中有控件WebVie ...
- CSS-BFC
最近看幕课网CSS之Float,float最初是为了实现文字的环绕效果:这里面提到BFC,刚好项目中正用到一种解决BFC的方法,DIV在添加float后,就不存在文档流中啦,不占据空间,这使的一些未浮 ...
- swift 截取字符串