牛客小白赛 - 93
一 - 生不逢七
链接:https://ac.nowcoder.com/acm/contest/82401/A
来源:牛客网
题目描述
睡前游戏中最简单又最好玩的游戏就是这个啦!
该游戏规则为:多名玩家轮流报数,当要报的数字中含有 7 或者是 7 的倍数时(例如 37,49),不能将该数报出来,要换一种提前规定好的方式报数,当一个人报错或者报慢了这个人就输了。
我们认为玩家是围成一圈进行游戏的,第 n 个人报完数之后,会轮到第 1 个人报数。
现在告诉你玩家的总人数以及你上一个人报的数(用数字表示,即便这个数含有 7 或者是 7 的倍数),你需要预测接下来 kkk 轮你要报的数字,当你需要报的数字含有 7 或者是 7 的倍数时,你需要输出字符 p。
输入描述:
第一行一个整数 T,表示输入数据的组数。
接下来每组数据中均只有一行数据,每行三个整数 n,a,k,分别表示玩家数量,你的上一位玩家报的数,你需要模拟的游戏轮数。
输出描述:
共 T 行,每行输出 kkk 个整数或者字符 p。
示例1
输入
3
2 16 3
3 69 3
2 1 10
输出
p 19 p
p p p
2 4 6 8 10 12 p 16 18 20
//比较简单的模拟
#include<bits/stdc++.h>
using namespace std;
bool check(int x)
{
if(x%7 == 0) return true;
while(x)
{
int t = x%10;
if(t == 7)
return true;
x /= 10;
}
return false;
}
int main()
{
int t;
cin >> t;
while(t --)
{
int n, a, k;
cin >> n >> a >> k;
if(check(a+1)) cout << 'p' << " ";
else cout << a+1 << " ";
int b = k-1;
while(b --)
{
int s = a+1;
if(check(s+n)) cout << 'p' << " ";
else cout << s+n << " ";
a = s+n-1;
}
cout << endl;
}
return 0;
}
二 - 交换数字
链接:https://ac.nowcoder.com/acm/contest/82401/B
来源:牛客网
题目描述
Baijiaohu有两个长度均为 n 且不包含前导零的数字 a,b ,现在他可以对这两个数字进行任意次操作:
- 选择一个整数 1≤i≤n ,并交换 a,b 的第 i 位 。
请输出任意次操作后 a×b的最小值,由于答案可能很大,请对 998244353 取模。
输入描述:
第一行输入一个数字 n 代表两个数字的长度
第二到三行输入两个字符串 a,b
输出描述:
输出一个 ans 表示最后的答案
请对 998244353 取模
示例1
输入
3
159
586
输出
91884
#include<bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
typedef long long LL;
int n;
string s1, s2;
LL a, b;
/*
vector<int> mul(vector<int> &A, vector<int> &B) {
vector<int> C(A.size() + B.size());
for (int i = 0; i < A.size(); i++) {
for (int j = 0; j < B.size(); j++) {
C[i + j] += A[i] * B[j];
}
}
int t = 0;
for (int i = 0; i < C.size(); i++) {
t += C[i];
C[i] = t % 10;
t /= 10;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
*/
int main()
{
cin >> n;
cin >> s1 >> s2;
/*
for(int i=s1.size()-1; i>=0; i--)
{
if(s1[i] > s2[i])
{
a.push_back(s1[i] - '0');
b.push_back(s2[i] - '0');
}
else
{
a.push_back(s2[i] - '0');
b.push_back(s1[i] - '0');
}
}
for(int i=0; i<a.size(); i++)
cout << a[i] << " ";
cout << endl;
for(int i=0; i<a.size(); i++)
cout << b[i] << " ";
cout << endl;
*/
/*
vector<int> result = mul(a, b);
long long ans = 0;
for(int i = result.size() - 1; i >= 0; i--)
{
ans = ans*10 + result[i];
}
cout << ans;
vector<int> result = mul(a, b);
long long ans = 0;
for(int i = result.size() - 1; i >= 0; i--)
{
ans = ans*10 + result[i];
}
cout << ans % MOD;
*/
for(int i = 0; i<n; i++)
{
if(s1[i] > s2[i]) swap(s1[i], s2[i]);
a = (a*10 + (s1[i] - '0')) % MOD; //在转化类型和分类时 进行 MOD; (a*b)%p == (a%p)*(b%p)%p !!!
b = (b*10 + (s2[i] - '0')) % MOD;
}
LL ans = a * b % MOD;
cout << ans << endl;
return 0;
}
三 - 老虎机
链接:https://ac.nowcoder.com/acm/contest/82401/C
来源:牛客网
题目描述
老虎机游玩规则:共有三个窗口,每个窗口在每轮游玩过程中会等概率从图案库里选择一个图案,根据最后三个窗口中图案的情况获得相应的奖励。
你有一个老虎机,你可以设定这个老虎机图案的数量和收益规则。
现在你设定了图案的数量为 m,没有相同的图案得 a 元,一对相同的图案 b 元,三个相同的图案 c 元。
想知道在你设定的规则下,单次游玩期望收益是多少?答案对 99824435 取模。
根据 逆元 的定义,如果你最后得到的答案是形如 ab\frac{a}{b}ba 的分数,之后你需要对 ppp 取模的话,你需要输出 (a×bmod−2) 来保证你的答案是正确的。
输入描述:
第一行一个整数 T(1≤T≤10^4)
接下来T 行,每行四个整数 m,a,b,c(1≤m,a,b,c≤10^6)
输出描述:
一个整数表示答案,答案对 998244353 取模。
示例1
输入
1
2 2 3 4
748683268
知识点:费马小定理 — p为质数时,b^p = b (mod p )
推论:模数 p 为 质数时, b^p-2 就是 b 乘法逆元
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long LL;
const int MOD = 998244353;
int m, a, b, c, t;
int qmi(int m, int k, int p) //快速幂
{
int res = 1, t = m;
while(k)
{
if(k&1) res = res * t % p;
t = t * t % p;
k >>= 1;
}
return res;
}
int get(int x)
{
LL p = MOD;
return qmi(x, p-2, p); //求逆元
}
signed main()
{
cin >> t;
while(t --)
{
cin >> m >> a >> b >> c;
LL sum = m * m % MOD * m % MOD;
LL a2 = 3LL * m * (m - 1) % MOD, a3 = m; //两种和三种的有几种方式
LL ans = a2 * b + a3 * c + (sum - a2 - a3) * a; //期望
ans = (ans % MOD + MOD) % MOD; //防止出现负数
ans = ans * get(sum) % MOD;
cout << ans << endl;
}
return 0;
}