ZOJ Monthly, March 2018 Solution
Posted dup4
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZOJ Monthly, March 2018 Solution相关的知识,希望对你有一定的参考价值。
A - Easy Number Game
水。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define ll long long 5 #define N 100010 6 ll arr[N]; 7 int n, m; 8 9 int main() 10 { 11 int t; scanf("%d", &t); 12 while (t--) 13 { 14 scanf("%d%d", &n, &m); 15 for (int i = 1; i <= n; ++i) scanf("%lld", arr + i); 16 sort(arr + 1, arr + 1 + n); 17 ll res = 0; 18 for (int i = 1; i <= m; ++i) 19 res += arr[i] * arr[2 * m - i + 1]; 20 printf("%lld ", res); 21 } 22 return 0; 23 }
B - Lucky Man
题意:判断大数开根后的奇偶性
思路:牛顿迭代法
1 import java.io.BufferedInputStream; 2 import java.util.Scanner; 3 import java.math.*; 4 5 public class Main { 6 7 public static void main(String[] args) { 8 Scanner in = new Scanner(new BufferedInputStream(System.in)); 9 int t = in.nextInt(); 10 BigInteger a, x, two; String n; 11 two = BigInteger.valueOf(2); 12 while (t-- != 0) 13 { 14 n = in.next(); 15 a = new BigInteger(n); 16 x = new BigInteger(n.substring(0, n.length() / 2 + 1)); 17 while (a.compareTo(x.multiply(x)) < 0) 18 x = x.add(a.divide(x)).divide(two); 19 if (x.mod(two).compareTo(BigInteger.ZERO) == 0) System.out.println(0); 20 else System.out.println(1); 21 } 22 in.close(); 23 } 24 }
C - Travel along the Line
题意:一维坐标系中,刚开始位于原点,有$frac{1}{4}$的概率 坐标 +1 和 -1 有$frac {1}{2} 的概率 不动$ 求在第n秒的时候恰好到达第m个位置的概率
思路:考虑把一个0拆成两个0,变成四种操作,这样四种操作是等概率的,那么所有的可能性就是 $4^n$ 再考虑符合条件的方案数
可以考虑将m通过坐标变换转化成正直,那么一个满足题意的操作序列肯定是 1 的个数 减去 -1的 个数 恰好为m
那么我们只需要枚举1的个数,排列组合一下即可
16说 假如用a 表示 1 的个数 b 表示 -1 的个数 c 表示 0的个数
那么有$frac {n!} {a! cdot b! cdot c!}$ 但是这里要考虑 多乘上$2^c$ 因为每个0都有两种选择 ,可以是$0_1 或者 是 0_2$
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define ll long long 5 #define N 100010 6 ll MOD = (ll)1e9 +7; 7 8 ll fac[N], Bit[N]; 9 ll qmod(ll base, ll n) 10 { 11 ll res = 1; 12 while (n) 13 { 14 if (n & 1) res = res * base % MOD; 15 base = base * base % MOD; 16 n >>= 1; 17 } 18 return res; 19 } 20 21 void Init() 22 { 23 fac[0] = 1; 24 Bit[0] = 1; 25 for (int i = 1; i < N; ++i) fac[i] = fac[i - 1] * i % MOD; 26 for (int i = 1; i < N; ++i) Bit[i] = Bit[i - 1] * 2 % MOD; 27 } 28 29 int n, m; 30 31 int main() 32 { 33 Init(); 34 int t; scanf("%d", &t); 35 while (t--) 36 { 37 scanf("%d%d", &n, &m); 38 if (m < 0) m = -m; 39 ll p = 0, q = qmod(4, n); 40 for (int i = 0; 2 * i + m <= n; ++i) 41 p = (p + (fac[n] * qmod(fac[i], MOD - 2) %MOD * qmod(fac[i + m], MOD - 2) % MOD * qmod(fac[n - 2 * i - m], MOD - 2) % MOD * Bit[n - 2 * i - m] % MOD)) % MOD; 42 ll res = p * qmod(q, MOD - 2) % MOD; 43 printf("%lld ", res); 44 } 45 return 0; 46 }
D - Machine Learning on a Tree
留坑。
E - Yet Another Tree Query Problem
留坑。
F - And Another Data Structure Problem
留坑。
G - Neighboring Characters
留坑。
H - Happy Sequence ZOJ
题意:用1-n的数,每个数可以用无限次,组成长度为m的序列,求有多少个序列满足 $gcd(b_i, b_{i +1}) = b_{i}$
思路:考虑枚举序列里面不同的数的个数,根据题目范围,最多有10个不同的数,然后隔板法求方案数
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define ll long long 5 long long f[15]; 6 long long C[15]; 7 long long MOD; 8 int p[15]; 9 int n, m; 10 11 void dp(int t) { 12 int j; 13 j = 2; 14 while (p[t - 1] * j <= n) { 15 p[t] = p[t - 1] * j; 16 f[t]++; 17 dp(t + 1); 18 j++; 19 } 20 } 21 22 ll qmod(ll base, ll n) 23 { 24 ll res = 1; 25 while (n) 26 { 27 if (n & 1) res = res * base % MOD; 28 base = base * base % MOD; 29 n >>= 1; 30 } 31 return res; 32 } 33 34 int main() 35 { 36 int i, j, t; 37 long long ans; 38 scanf("%d", &t); 39 MOD = 1000000007; 40 while (t--) { 41 scanf("%d %d", &n, &m); 42 memset(f, 0, sizeof f); 43 memset(p, 0, sizeof p); 44 ans = 0; 45 C[0] = 1; 46 for (i = 1; i <= 11 ; ++i) 47 C[i] = (C[i - 1] * (m - i) % MOD * qmod(i, MOD - 2)) % MOD; 48 for (i = 1; i <= n; ++i) { 49 p[1] = i; 50 ++f[1]; 51 dp(2); 52 } 53 for (i = 1; i <= 11; ++i) { 54 ans = (ans + f[i] * C[i - 1] % MOD) % MOD; 55 } 56 printf("%lld ",ans); 57 } 58 return 0; 59 }
I - Your Bridge is under Attack
留坑。
J - Super Brain
水。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define N 100010 5 int n; 6 int cnt[N * 10], a[N], b[N]; 7 8 int main() 9 { 10 int t; scanf("%d", &t); 11 while (t--) 12 { 13 scanf("%d", &n); 14 for (int i = 1; i <= n; ++i) scanf("%d", a + i); 15 for (int i = 1; i <= n; ++i) scanf("%d", b + i); 16 memset(cnt, 0, sizeof cnt); 17 for (int i = 1; i <= n; ++i) ++cnt[a[i]]; 18 int res = 0; 19 for (int i = 1; i <= n; ++i) if (cnt[b[i]] == 1) 20 { 21 res = b[i]; 22 break; 23 } 24 printf("%d ", res); 25 } 26 return 0; 27 }
以上是关于ZOJ Monthly, March 2018 Solution的主要内容,如果未能解决你的问题,请参考以下文章
Worldwide Monthly International Tax Policy (March 2018)
[ZOJ]ZOJ Monthly, January 2018
ZOJ Monthly, June 2018 - I District Division