Codeforces Round #139 (Div. 2)

做了一发cf,又瞻仰了一下tourist大神呀~~前三道a的灰常顺利了,后来太困了,d,e就木有拍。

A:水题,不解释

B:k-bonacci 因为k大于1 ,那么k-bonacci数就很少了,先根据K求出所有的k-bonacci数,然后dfs暴搜吧,当然平常的优化是要有滴~~~

C:一眼就应该想到是dp吧,dp[i][flag][len]  代表从第一列到第i列 最后一位是‘#’还是‘*’  以及最后连续的‘#’或是‘*’有len个  时最少改变的次数~~

E:比赛时没看这道题,下来看了才发现是道大水题。。。稍稍打表就看出梅森素数了吧~~~

代码入下:

B:

#include<stdio.h>   
#include<string.h>   
#include <string>
#include <cmath>
#include <iostream>
#include <map>
#include<vector>   
#include<queue>
#include <set>
#include<algorithm>   
#define fr(i,s,n) for(int i=s;i<n;i++)
#define pf printf
#define sf scanf
#define sfv1(a) scanf("%d",&a)
#define sfv2(n,m) scanf("%d%d",&n,&m)
#define sfv3(u,v,w) scanf("%d%d%d",&u,&v,&w)
#define sfstr(c) scanf("%s",c)
#define pfv1(a) printf("%d\n",a)
#define fi freopen("in.txt","r",stdin)
#define fo freopen("out.txt","w",stdout)
#define cl(a) memset(a,0,sizeof(a))
#define me(a,x) memset(a,x,sizeof(a))
#define inf 2147483647
using namespace std;
typedef long long ll;

const ll mx=1e9;



ll a[100];
int pos;
int s;


void init(int k){
	a[0]=0;a[1]=1;
	
	pos=2;int lim;
	while(1){
		lim=max(0,pos-k);
		for(int i=pos-1;i>=lim;i--){
			a[pos]+=a[i];
		}
		if (a[pos]>=mx) break;
		pos++;
	}
}

ll nxtcost;
ll ans[100];
int tot;
ll sum[50];

bool solve(int step,ll cost){
	if (sum[step]+cost<s||step>=pos) return 0;

	nxtcost=cost+a[step];

	if (nxtcost<s){
		ans[tot++]=a[step];
		if (solve(step+1,nxtcost)) return 1;
		tot--;	
	}
	else if (nxtcost>s){
		if (solve(step+1,cost)) return 1;
	}
	else{
		if (tot==0) pf("2\n");
		else pf("%d\n",tot+1);
		fr(i,0,tot){
			pf("%d ",ans[i]);
		}
		if (tot==0) pf("0 ");
		pf("%d\n",a[step]);
		return 1;	
	}
	return 0;
}

int main(){
	int k;
	sfv2(s,k);
	init(k);
	reverse(a,a+pos);
	sum[pos]=0;
	for(int i=pos-1;i>=0;i--) sum[i]=sum[i+1]+a[i];
	tot=0;
	if (!solve(0,0)) pf("no");
	return 0;
}

C:

#include<stdio.h>   
#include<string.h>   
#include <string>
#include <cmath>
#include <iostream>
#include<algorithm>   
#define fr(i,s,n) for(int i=s;i<n;i++)
#define pf printf
#define sf scanf
#define fi freopen("in.txt","r",stdin)
#define cl(a) memset(a,0,sizeof(a))
#define me(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int N=1010;
const int mx=1000000000;
int dp[N][2][N];
int n,m,x,y;
char mp[N][N];
int cost[N][2];

void init(){
	int tmp;
	fr(j,0,m){
		fr(i,0,y+1){
			dp[j][0][i]=dp[j][1][i]=mx;
		}
		tmp=0;
		fr(i,0,n){
			if (mp[i][j]=='.') tmp++;
		}
		cost[j][0]=n-tmp;
		cost[j][1]=tmp;
	}
	
}

void solve(){
	dp[0][0][1]=cost[0][0];
	dp[0][1][1]=cost[0][1];

	fr(i,1,m){
		fr(k,x,y+1){
			dp[i][0][1]=min(dp[i][0][1],dp[i-1][1][k]+cost[i][0]);
		}
		fr(k,2,y+1){
			dp[i][0][k]=min(dp[i][0][k],dp[i-1][0][k-1]+cost[i][0]);
		}

		fr(k,x,y+1){
			dp[i][1][1]=min(dp[i][1][1],dp[i-1][0][k]+cost[i][1]);
		}
		fr(k,2,y+1){
			dp[i][1][k]=min(dp[i][1][k],dp[i-1][1][k-1]+cost[i][1]);
		}
	}
	int ans=mx;

	fr(i,x,y+1){
		if (dp[m-1][0][i]<ans) ans=dp[m-1][0][i];
		if (dp[m-1][1][i]<ans) ans=dp[m-1][1][i];
	}
	pf("%d\n",ans);
}
int main(){
	sf("%d%d%d%d",&n,&m,&x,&y);
	fr(i,0,n){
		sf("%s",mp[i]);
	}
	init();
	solve();
	return 0;
}


E:

#include<stdio.h>   
#include<string.h>   
#include <cmath>
#include <iostream>
#include<algorithm>   
#define fr(i,s,n) for(int i=s;i<n;i++)
#define pf printf
#define sf scanf
#define fi freopen("in.txt","r",stdin)
#define cl(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
const int Mod = 1000000007;

int a[40] = {2,3,5,7,13,17,19,31,61,89,107,127,521,607,1279,2203,2281,3217,4253,4423,9689,9941,11213,19937,21701,23209,44497,
	86243,110503,132049,216091,756839,859433,1257787,1398269,2976221,3021377,6972593,13466917,20996011};

int main() {
	int n;
	sf("%d",&n);
	int x = 1;
	for (int i=1;i<a[n-1];i++) {
		x *= 2;
		if (x >= Mod) x -= Mod;
	}
	pf("%d\n",(x+Mod-1) % Mod);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值