1. 程式人生 > >2018牛客小白月賽7

2018牛客小白月賽7

文章目錄

B 自殺遊戲

題目連結:https://www.nowcoder.com/acm/contest/190/B 這個就是個很經典的取石子游戲,感覺就是用那啥sg函式的,但是時間上不行,然後這個提酒是很經典的那種什麼必勝點必敗點那樣推過來,當時學的時候就有點懵逼,現在重新學哈,反正結論就是: 能從必敗點推過來的就是必勝點 這道題反正就用這個就行了

因為這道題他條了時間都還要增加轉移的一秒,所以a++,b++

#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const int MOD=
1e9+7; int dp[maxn]; int main() { int N,a,b; cin>>N>>a>>b; a++,b++; //因為他是調了炸彈還要有1秒的傳炸彈的時間 for(int i=1;i<=N;i++) { if(dp[i-1]==0)dp[i]=1; else { for(int j=max(0,i-b);j<=max(-1,i-a);j++)//j必須在合法的範圍內 { if(dp[j]==0) { dp[i]=1; break; } } }
} cout<<(dp[N]?"Alice":"Bob")<<endl; }

J-方格填色

把白的看成1 ,黑的看成0,然後他給的那兩個條件就非常好寫了,就是一個狀壓dp+矩陣快速冪

#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const int MOD=1e9+7;
struct Matrix
{
    int n;
    LL a[33][33];
    Matrix (int n):n(n)
    {
        for
(int i=0;i<n;i++) for(int j=0;j<n;j++)a[i][j]=0; } }; Matrix operator*(Matrix A,Matrix B) { int n=A.n; Matrix res(n); for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) { res.a[i][j]+=(LL)A.a[i][k]*B.a[k][j]%MOD; res.a[i][j]%=MOD; } return res; } Matrix operator^(Matrix A,LL b) { int n=A.n; Matrix res(n),base=A; for(int i=0;i<n;i++)res.a[i][i]=1; while(b) { if(b&1LL)res=res*base; base=base*base; b>>=1; } return res; } int main() { LL M,N; while(cin>>M>>N) { Matrix A(1<<M); //°×µÄÊÇ1£¬ºÚµÄÊÇ0 for(int i=0;i<(1<<M);i++) { for(int j=0;j<(1<<M);j++) { if((i&j))continue; //Á½¸ö°×µÄÏàÁÚ if((i|j)==0)continue; //Á½Áж¼ÊǺÚÉ« A.a[i][j]=1; } } A=A^(N-1); LL ans=0; for(int i=0;i<(1<<M);i++) { for(int j=0;j<(1<<M);j++) { ans+=A.a[i][j]; ans%=MOD; } } cout<<ans<<endl; } }