Coin Toss(uva 10328,动态规划递推,限制条件,至少转至多,高精度)
有n张牌,求出至少有k张牌连续是正面的排列的种数。(1=<k<=n<=100)
work in case of choosing head or tail. If anyone becomes winner choosing head he always wants to choose head. Nobody believes that his winning chance is 50-50. However in this problem we will deal with a fair coin and n times tossing of such a coin. The result
of such a tossing can be represented by a string. Such as if 3 times tossing is used then there are possible 8 outcomes.
As the coin is fair we can consider that the probability of each outcome is also equal. For simplicity we can consider that if the same thing is repeated 8 times we can expect to get each possible sequence
once.
The Problem
In the above example we see 1 sequnce has 3 consecutive H, 3 sequence has 2 consecutive H and 7 sequence has at least single H. You have to generalize it. Suppose a coin is tossed n times. And the same
process is repeated 2^n times. How many sequence you will get which contains a consequnce of H of length at least k.
The input will start with two positive integer, n and k (1<=k<=n<=100). Input is terminated by EOF.
The Output
For each test case show the result in a line as specified in the problem statement.
Sample Input
4 2
4 3
4 4
6 2
8
3
1
43
/*
思路:
ps(a数组内部的递推计算本来应该也用高精度整数来计算,但是被我省略了,因为太懒了)
(把至少k个正面)转换为(至多n个正面)-(至多k-1个正面)
对于(至多n个正面),它等于2^n,考虑到n比较大,用高精度大整数来计算出2^n 对于(至多k-1个正面)
先根据k-1是否为0定义f[1][1]的初始值
f[1][2]肯定为1
ps.数组的第二维中1代表正,2代表反的总情况数
由于对反面牌没有要求,所以:
第i次为反情况数=第i-1次为正情况数+第i-1次为反情况数 如果i<=k-1,随便放,那么第i次为正情况数=第i-1次为正情况数+第i-1次为反情况数 如果i=(k-1)+1,那么第i次为正情况数=第i-1次为正情况数+第i-1次为反情况数-1
那个-1是减去前面全是正面的情况
如果i>(k-1)+1,那么第i次为正情况数=第i-1次为正情况数+第i-1次为反情况数-第i-(k-1)-1次为反情况数
那个-第i-(k-1)-1次为反情况数 是排除第i-(k-1)-1次为反而且中间全是正的情况的情况
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=;
ll a[maxn][];
ll big[maxn];
int main()
{
ll n,k;
cin>>n>>k;
big[]=;
big[]=;
for(ll i=;i<=n;i++)
{
for(ll i=;i<=big[];i++)
big[i]*=;
for(ll i=;i<=big[];i++)
{
if(big[i]>=)
{
big[i+]+=big[i]/;
big[i]%=;
}
if(big[big[]+]>)
big[]++;
}
} if(k-==)
{
a[n][]=,a[n][]=;
goto dog;
} a[][]=;a[][]=;
for(ll i=;i<=n;i++)
{
a[i][]=a[i-][]+a[i-][]; if(i<=k-)
a[i][]=a[i-][]+a[i-][];
else if(i==k-+)
a[i][]=a[i-][]+a[i-][]-;
else
a[i][]=a[i-][]+a[i-][]-a[i-(k-)-][];
}
dog:;
big[]-=a[n][]+a[n][];
while(big[]<)
{
big[]+=pow(,big[]-);
big[big[]]--;
if(big[big[]]==)
{
big[]--;
}
}
for(ll i=;i<=big[];i++)
{
if(big[i]>=)
{
big[i+]+=big[i]/;
big[i]%=;
}
if(big[big[]+]>)
big[]++;
}
for(ll i=big[];i>=;i--)
printf("%lld",big[i]);
return ;
}
Coin Toss(uva 10328,动态规划递推,限制条件,至少转至多,高精度)的更多相关文章
- attack on titans(动态规划递推,限制条件,至少转至多方法,进击的巨人)
题目意思: 给n个士兵排队,每个士兵三种G.R.P可选,求至少有m个连续G士兵,最多有k个连续R士兵的排列的种数. 原题 Attack on Titans Time Limit: 2 Seconds ...
- 递推DP(至少和至多之间的转换
UVa 10328 - Coin Toss 题意:给你一个硬币,抛掷n次,问出现连续至少k个正面向上的情况有多少种. 转换成抛N次至多连续有N个减去抛N次至多连续有K-1个1的情况 dp[i][k]表 ...
- UVa 10328 Coin Toss(Java大数+递推)
https://vjudge.net/problem/UVA-10328 题意: 有H和T两个字符,现在要排成n位的字符串,求至少有k个字符连续的方案数. 思路:这道题目和ZOJ3747是差不多的,具 ...
- 最长上升子序列(动态规划递推,LIS)
1759:最长上升子序列 题目: 总时间限制: 2000ms 内存限制: 65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的 ...
- 最大子段和(洛谷P1115,动态规划递推)
洛谷题目链接 题目赋值出来格式有问题,所以我就只放题目链接了 下面为ac代码 #include<bits/stdc++.h> #define ll long long using name ...
- UVa 10520【递推 搜索】
UVa 10520 哇!简直恶心的递推,生推了半天..感觉题不难,但是恶心,不推出来又难受..一不小心还A了[]~( ̄▽ ̄)~*,AC的猝不及防... 先递推求出f[i][1](1<=i< ...
- Uva 10446【递推,dp】
UVa 10446 求(n,bcak)递归次数.自己推出来了一个式子: 其实就是这个式子,但是不知道该怎么写,怕递归写法超时.其实直接递推就好,边界条件易得C(0,back)=1.C(1,back)= ...
- UVa 10943 (数学 递推) How do you add?
将K个不超过N的非负整数加起来,使它们的和为N,一共有多少种方法. 设d(i, j)表示j个不超过i的非负整数之和为i的方法数. d(i, j) = sum{ d(k, j-1) | 0 ≤ k ≤ ...
- UVa 557 (概率 递推) Burger
题意: 有两种汉堡给2n个孩子吃,每个孩子在吃之前要抛硬币决定吃哪一种汉堡.如果只剩一种汉堡,就不用抛硬币了. 求最后两个孩子吃到同一种汉堡的概率. 分析: 可以从反面思考,求最后两个孩子吃到不同汉堡 ...
随机推荐
- 【bzoj1798】[Ahoi2009]Seq 维护序列seq
大意:一个数组,三个操作,第一种是区间[a,b]每个数乘乘,第二种是区间[a,b]每个数加c,第三种是查询[a,b]区间的和并对p取摸. 两种操作就不能简单的只往下传标记.每次传乘法标记时,要把加法标 ...
- CodeForces 731B Coupons and Discounts (水题模拟)
题意:有n个队参加CCPC,然后有两种优惠方式,一种是一天买再次,一种是买两天,现在让你判断能不能找到一种方式,使得优惠不剩余. 析:直接模拟,如果本次是奇数,那么就得用第二种,作一个标记,再去计算下 ...
- bzoj 1029: [JSOI2007]建筑抢修【贪心+堆】
第一想法是按照结束时间贪心,但是这样有反例 所以先按照t贪心,能选则选,把选的楼的持续时间放进大根堆里,当当前的楼不能选的时候如果当前的持续时间比大根堆里最大的要小,就用这个替换最大,这样总数不变但是 ...
- 基于Numpy的神经网络+手写数字识别
基于Numpy的神经网络+手写数字识别 本文代码来自Tariq Rashid所著<Python神经网络编程> 代码分为三个部分,框架如下所示: # neural network class ...
- Android 性能优化(14)网络优化( 10)Determining and Monitoring the Connectivity Status
Determining and Monitoring the Connectivity Status This lesson teaches you to Determine if you Have ...
- Hadoop Hive概念学习系列之hive的正则表达式初步(六)
说在前面的话 hive的正则表达式,是非常重要!作为大数据开发人员,用好hive,正则表达式,是必须品! Hive中的正则表达式还是很强大的.数据工作者平时也离不开正则表达式.对此,特意做了个hive ...
- Objective-C设计模式——中介者Mediator(对象去耦)
中介者模式 中介者模式很好的诠释了迪米特法则,任意两个不相关的对象之间如果需要关联,那么需要通过第三个类来进行.中介者就是把一组对象进行封装,屏蔽了类之间的交互细节,使不同的类直接不需要持有对方引用也 ...
- pycharm永久激活(转载)
转载自CSDN--http://blog.csdn.net/mr_hhh/article/details/79062747 2018-02-2417:30:52 今天再补充一个教程,关于pycharm ...
- TensorFlow车牌识别实践(1)
本文对公开的文章进行验证,从环境搭建到运行到结果分析. 1,文章:基于TensorFlow的车牌号识别系统 文章(译文) http://www.cnblogs.com/Jsmile2017/p/680 ...
- px-em-rem单位转换
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...