LL mod_pow(LL x, LL n){ LL res = 1; while (n) { if (n & 1) res = res * x % mod; x = x * x % mod; n >>= 1; } return res; }
intmain(){ int n, m, x; bool f = false; cin >> n >> m; for (int i = 0; i < m; i++) { cin >> x; if (x & 1)f = true; } cout << (f ? mod_pow(2, n - 1) : 0) << endl; return0; }
5
Problem A 友好的阶乘
1 2 3 4 5 6 7 8 9 10 11 12 13
#include<bits/stdc++.h> usingnamespacestd;
intmain(){
int n; cin >> n; int res = 1; for(int i = 2; i <= n; i++) res *= i; cout << res << endl;
#include<stdio.h> intmain(){ int n; scanf("%d", &n); n = n * n; while (n--) { puts("Bai is a lovely girl."); } }
Problem B 善良的白学姐
利用C++ STL 中的 set 可以直接判断出结果。
也可以使用一个数组作为桶记录出现过的数字,然后统计一下总个数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include<bits/stdc++.h> usingnamespacestd; constint maxn = int(1e4); set<int> S; int a[maxn]; intmain(){ int n; cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; S.insert(a[i]); } cout << S.size() << endl; }
Problem C 优秀的白学姐
能够得到一个递推式:
基础条件:dp(1) = 1
如果 i 是奇数:dp(i) = dp(i-1)
如果 i 是偶数:dp(i) = dp(i-1) + dp(i/2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include<bits/stdc++.h> usingnamespacestd; constint mod = int(1e8); constint maxn = int(1e3) + 5; int dp[maxn]; intmain(){ int n; scanf("%d", &n); dp[1] = 1; for (int i = 2; i <= n; i++) { dp[i] = (dp[i-1] + (i % 2 == 0 ? dp[i/2] : 0)) % mod; } cout << dp[n] << endl; return0; }
Problem D 美丽的白学姐
如果在第 i 个房间,那么编号一定大于前 i-1 个房间的人数总和,并且小于 前 i 个房间的人数总和。 求一下前 n 项的和,sum[i] 一定单调递增,可以利用二分查找找到符合条件的房间号。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#include<bits/stdc++.h> #define int long long usingnamespacestd; constint maxn = int32_t(2e5); int a[maxn], b[maxn], sum[maxn]; int32_t main() { int n, m, c; cin >> n >> m; for (int i = 0; i < n; i++) { cin >> a[i]; sum[i+1] = a[i] + sum[i]; } for (int i = 0; i < m; i++) { cin >> c; auto p = lower_bound(sum, sum + n + 1, c) - 1; auto id = p - sum + 1; cout << id << " " << (c - *p) << endl; } }