AtCoder Beginner Contest 195 E. Lucky 7 Battle

链接

https://atcoder.jp/contests/abc195/tasks/abc195_e

题意

字符串 S S S 只包含数字,字符串 X X X 只包含 AT,字符串 T 是空串。

X i X_i XiA 时,Aoki 操作,否则 Takahashi 操作。

每次操作可将 0 0 0 S i S_i Si 放在 T T T 末尾。

如果 T T T 7 7 7 的倍数则 Takahashi 获胜,否则 Aoki 获胜。

思路

回合编号从 0 0 0 开始,总共 n n n 个回合。

d p i , j dp_{i,j} dpi,j 为当前为第 i i i 个回合,该回合之前余数为 j j j 时 Takahashi 是否能获胜。

若Takahashi 获胜, d p n , 0 = 1 dp_{n,0}=1 dpn,0=1,然后进行倒推:

  • X i = X_i= Xi=T d p i , j = d p i + 1 , ( j ∗ 10 + s i ) % 7 ∣ d p i + 1 , j ∗ 10 % 7 dp_{i,j}=dp_{i+1,(j*10+s_i)\%7}|dp_{i+1,j*10\%7} dpi,j=dpi+1,(j10+si)%7dpi+1,j10%7
    当前为第 i i i 回合且 Takahashi 操作,两种放置中有一种 Takahashi 能获胜即可。
  • X i = X_i= Xi=A d p i , j = d p i + 1 , ( j ∗ 10 + s i ) % 7 & d p i + 1 , j ∗ 10 % 7 dp_{i,j}=dp_{i+1,(j*10+s_i)\%7}\&dp_{i+1,j*10\%7} dpi,j=dpi+1,(j10+si)%7&dpi+1,j10%7
    当前为第 i i i 回合且 Aoki 操作,必须保证两种放置后 Takahashi 都能获胜。

最后只要判断 d p 0 , 0 dp_{0,0} dp0,0 是否为 1 1 1

代码

#include <bits/stdc++.h>
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define FI first
#define SE second
using namespace std;
typedef double DB;
typedef long double LD;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<PII> VPII;
// head
const int N=2e5+5;
int n,dp[N][7];
string s,x;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>n>>s>>x;
    dp[n][0]=1;
    for(int i=n-1;~i;i--) {
        for(int j=0;j<7;j++) {
            int a=dp[i+1][(j*3+s[i]-'0')%7],b=dp[i+1][j*3%7];
            if(x[i]=='T') dp[i][j]=a|b;
            else dp[i][j]=a&b;
        }
    }
    cout<<(dp[0][0]?"Takahashi":"Aoki")<<'\n';
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值