NC253158. 小红过61
描述
输入描述
一个仅由数字组成的字符串,长度不超过。
输出描述
满足题目条件的子序列数量。
示例1
输入:
12
输出:
3
说明:
有3个非空子序列,均符合条件。示例2
输入:
654321
输出:
62
C++(g++ 7.5.0) 解法, 执行用时: 6ms, 内存消耗: 644K, 提交时间: 2023-06-01 23:15:18
#include<bits/stdc++.h> #define int long long using namespace std; const int mod=1e9+7; signed main() { string s; cin>>s; int ans=0,q=0; for(int i=0;i<s.length();i++){ if(s[i]=='1'){ ans=(2*ans+1-q+mod)%mod; }else{ if(s[i]=='6') q=(q+ans+1)%mod; ans=(2*ans+1)%mod; } } cout<<(ans+mod)%mod; }
C++(clang++ 11.0.1) 解法, 执行用时: 6ms, 内存消耗: 672K, 提交时间: 2023-06-02 00:01:18
#include<bits/stdc++.h> using namespace std; #define int long long const int mod=1e9+7; signed main(){ int a[2]={1}; string s;cin>>s; for(auto c:s){ if(c=='1')a[0]=(a[0]*2)%mod; else if(c=='6')a[1]=(a[0]+a[1]*2)%mod; else a[0]=(a[0]*2+a[1])%mod; } cout<<(a[0]+a[1]+mod-1)%mod; }
pypy3 解法, 执行用时: 83ms, 内存消耗: 22216K, 提交时间: 2023-06-03 17:09:33
import sys input = lambda: sys.stdin.readline().strip() s = input() MOD = 10**9+7 # f: 遍历到当前位置的合法子序列个数 # g: 遍历到当前位置的所有以6为结尾的子序列个数 f = g = 0 for i, c in enumerate(s): if c == '1': f += f+1-g else: if c == '6': g += f+1 f += f+1 f %= MOD g %= MOD print(f)
Python3 解法, 执行用时: 81ms, 内存消耗: 4796K, 提交时间: 2023-06-01 22:26:40
s = input() MOD = 10**9+7 cur = 1 six = 0 for ch in s: if ch == '6': six += cur six %= MOD cur *= 2 cur %= MOD if ch == '1': cur -= six cur %= MOD print((cur - 1) % MOD)