9.8 度小满笔试 50min AK
1、模拟
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
int n, k;
cin >> n >> k;
vector<char> v(n);
vector<int> idxs;
idxs.push_back(0);
int cnt = 0;
for(int i = 0; i < n; ++i) {
cin >> v[i];
if(v[i] == 'A') {
idxs.push_back(i);
++cnt;
}
}
int ans = n * (k / cnt);
if(k % cnt) {
ans += idxs[k % cnt] + 1;
}
else {
ans -= (n - idxs.back() - 1);
}
cout << ans;
}
2、深搜
#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<vector<int>> mp;
vector<int> color;
const int mod = 1e9 + 7;
int dfs(int cur) {
if(mp[cur].size() == 0) return 1;
int res{};
if(color[cur] == 1) {
for(auto child : mp[cur]) {
res += dfs(child);
}
}
else {
res = 1;
for(auto child : mp[cur]) {
res = (res * dfs(child)) % mod;
}
}
return res % mod;
}
signed main() {
int n;
cin >> n;
mp.resize(n + 1);
color.resize(n + 1);
int fa{};
for(int i = 2; i <= n; ++i) {
cin >> fa;
mp[fa].push_back(i);
}
for(int i = 1; i <= n; ++i) cin >> color[i];
cout << dfs(1);
}
3、快速幂(大概看了一下数据,感觉要快速幂)+深搜
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, A, B, M;
vector<vector<int>> mp;
int mod;
int fastmi(int a, int u) {
int ans = 1;
while(u) {
if(u & 1) ans = (ans * a) % mod;
u >>= 1;
a = (a * a) % mod;
}
return ans % mod;
}
int dfs(int cur) {
if(mp[cur].size() == 0) return 0;
int res = 0;
for(auto child : mp[cur]) {
res = (res + (dfs(child) + fastmi(A, cur)) * B) % mod;
}
return res;
}
signed main() {
cin >> n >> A >> B >> M;
mod = M;
mp.resize(n + 1);
int fa{};
for(int i = 2; i <= n; ++i) {
cin >> fa;
mp[fa].push_back(i);
}
cout << dfs(1);
}
#度小满笔试#
查看17道真题和解析