第一题: 题目描述 小乐得到了n张牌,第i张牌跟第i-1张牌相邻(2<=i<=n)。
每张牌都有正反两面,每一面上都有一个数字。
一开始小乐把所有的牌正面朝上,接下来小乐会选择其中的任意张牌(也可以是0张)并将它们翻转。
小乐想知道,有多少种翻转的方案,使得:
翻转后,任意两张相邻的牌所展示的数字不相同。
注意:两种方案不同当且仅当翻转的牌不同。
求满足条件的方案数,输出其对998244353取模的结果。
输入 第一行一个整数n(1<=n<=2*10^5),表示小乐拥有n张牌。
接下来n行每行两个整数ai,bi(1<=ai,bi<=10^9),分别表示正面和反面的数字。
输出 一行一个整数,表示方案数。
样例输入 复制 3 1 2 4 2 3 4 样例输出 复制 4 提示 样例解释:四种方案分别是:1 4 3,1 2 3,1 2 4,2 4 3
输入样例2:
4
1 5
2 6
3 7
4 8
输出样例2:
16
第二题: 题目描述
墨水
【题目描述】(moshui.cpp)
有一个数字的一部分被墨水挡住了,小明只知道它原本模13余5,请问这个数原本有几种情况?(这个数字的开头可以有0)
【输入格式】
一行包含一个字符串,包含(0-9和”?”,其中”?”表示被挡住了)长度小于10^5
【输出格式】
一行包含一个整数,表示可能性的数量,答案对10^9+7取余。
【输入样例1】
?44
【输出样例1】
1
【输入样例2】
??2??5
【输出样例2】
768
【样例解析】
样例1中只有044一种可能。
输入 输出 提示
这是我第二题的代码:
#include <bits/stdc++.h>
#define int long long
#pragma GCC optimize("02")
using namespace std;
const int mod=1e9+7;
int i,n,j,aa,f[100010][20];char a[200010];
main(){
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
cin>>a+1;n=strlen(a+1);f[1][0]=f[1][a[1]]=1;
for(i=1;i<=n;i++)
if(a[i]!='?'){
aa=a[i]-48;
for(j=0;j<=12;j++)
f[i][(aa*10+j)%13]+=f[i-1][j],f[i][(aa*10+j)%13]%=mod;
}
else
for(j=0;j<=12;j++)
for(aa=0;aa<=9;aa++)
f[i][(aa*10+j)%13]+=f[i-1][j],f[i][(aa*10+j)%13]%=mod;
cout<<f[n][5];
return 0;
}