菜鸡的淘汰赛反思
昨天差点人没了,还是自己太菜了,以后要加油,要认真学算法, 多刷题(ง •̀_•́)ง
1000 神奇的开关
被这题(自己太菜)搞得心态崩了 浪费了好多时间
题意: 给定长度为n的01序列,每次可以选取任意整数i,将i~n的所有位取反(即0变成1,1变成0),问最少几次操作之后可以得到全0序列。
本题有坑!!!学长给提示了,但我没看见 就是不能用 scanf("%c") QAQ
思路: 在字符串前加个0,然后找与上个字符不一样的字符的数量就行
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
string s;
int n;
cin >> n >> s;
s = "0" + s;
int cnt = 0;
for(int i = 1; i <= n; i ++)
if(s[i] != s[i - 1]) cnt ++;
cout << cnt << endl;
return 0;
}
1001 sq的简单数学公式
公式题,唯一的难点就是求逆元
补充:
1、求逆元
a、 什么是逆元? 若 \(a * b ≡ 1 (mod p)\) 则 a 为 b 在模p条件下的逆元 这样就可以将模p下的除法,转换成乘法
b、 求逆元 根据 欧拉定理 \(a^{φ(n)} \equiv 1\) (mod n) \(\varphi(n)\) 为欧拉函数, 是\(1-n\)中与\(n\)互质的数的个数 则可得 \(a* a^{φ(n) - 1} \equiv 1\) (mod n), a与\(a^{φ(n) - 1}\)互为模n下的逆元。
本题用的是一种特殊情况, 当\(n\)为质数时(费马小定理),\(φ(n) = n-1\) 此时 \(a^{n-1} \equiv 1\) (mod n) 即 \(a * a ^ {n - 2} \equiv 1\) (mod n) 故a的逆元为\(a^{n - 2}\)
2、快速幂
在1.a中用一般方法求\(a^{n - 2}\)可能会爆 \(long \: long\) 所以 我们可以将乘方分解成乘法, \(a^b\) = \(\overbrace {a*a*a*a \dots *a}\), 以倍增的方式扩大a
快速幂代码:
typedef long long ll;
ll ksm(ll a, ll b, ll p)
{
ll res = 1;
while(b)
{
if(b & 1) res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res;
}
1004 白嫖怪Long Long
题意: 给你两个字符串a, b 判断b是否为回文串, 若是, 则输出b在a中的位置
直接用kmp即可
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
vector<PII> res;
const int N = 1000010;
int nxt[N];
char a[N], b[N];
bool check()
{
int len = strlen(b + 1);
for(int i = 1, j = len; i < j; i ++, j --)
if(b[i] != b[j]) return false;
return true;
}
void getNxt()
{
int len = strlen(b + 1);
for(int i = 2, j = 0; i <= len; i ++)
{
while(j && b[i] != b[j + 1]) j = nxt[j];
if(b[i] == b[j + 1]) j ++;
nxt[i] = j;
}
}
void kmp()
{
getNxt();
int n = strlen(a + 1);
int m = strlen(b + 1);
for(int i = 1, j = 0; i <= n; i ++)
{
while(j && a[i] != b[j + 1]) j = nxt[j];
if(a[i] == b[j + 1]) j ++;
if(j == m)
{
j = nxt[j];
res.push_back({i - m + 1, i});
}
}
}
int main()
{
int t;
cin >> t;
while(t --)
{
scanf("%s", a + 1);
scanf("%s", b + 1);
if(check())
{
puts("YES");
kmp();
printf("%d\n", res.size());
for(auto t : res)
printf("%d %d\n", t.fi, t.se);
res.clear();
}
else puts("NO");
if(t) puts("");
}
return 0;
}