<span>UVA10328 Coin Toss</span>

考虑把答案拆成至多有\(n\)张朝上减去至少有\(k-1\)张朝上。
显然第一部分的答案就是\(2^n\),考虑\(DP\)第二部分。设\(dp[i][0/1]\)表示第\(i\)张是反面/正面的情况数。然后有:

\[dp[i][0]=dp[i-1][0]+dp[i-1][1] \]
\[dp[i][1]=dp[i-1][0]+dp[i-1][1]-dp[i-k-1][0] \]

然后处理下边界,比如\(i=k+1\)之类的。 然后这题的问题就转化为高精度了。显然我是不会的。所以就用$ int128 $水了。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

#define R register
#define LL __int128
const int inf = 0x3f3f3f3f;
const int MAXN = 100+10;

int n,k;
LL dp[MAXN][2];

inline void print(LL x) {
	if( x > 9 ) print(x / 10);
	putchar('0' + x % 10);
}

int main() {
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	while(cin>>n>>k) {
		k--;
		memset(dp,0,sizeof(dp));
		dp[1][0] = 1; dp[1][1] = k ? 1 : 0;
		for(R int i = 2; i <= n ; i++ ) {
			dp[i][0] = dp[i - 1][0] + dp[i - 1][1];
			if( i <= k ) dp[i][1] = dp[i - 1][0] + dp[i - 1][1];
			if( i == k + 1 ) dp[i][1] = dp[i - 1][0] + dp[i - 1][1] - 1;
			if( i > k + 1) dp[i][1] = dp[i - 1][0] + dp[i - 1][1] - dp[i - k - 1][0];
		}
		LL ans1 = 1;
		for(R int i = 1; i <= n ; i++ ) ans1 = ans1 * 2;
		print(ans1 - dp[n][0] - dp[n][1]); putchar('\n');
	}
	return 0;	
}
全部评论

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
KKorz:是这样的,还会定期默写抽查
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务