做了一发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;
}