Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)
Posted carered
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)相关的知识,希望对你有一定的参考价值。
题目链接:https://codeforces.com/contest/1247
A. Forgetting Things
思路:简单特判一下就行。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 std::ios::sync_with_stdio(false); 6 int a, b; 7 cin >> a >> b; 8 if(a == b){ 9 cout << a* 10 + 1 << " " << b* 10 + 2 << endl;; 10 } 11 else if(b - a == 1) cout << a << " " << b << endl; 12 else if(a == 9 && b == 1) cout << "9 10" << endl; 13 else cout << -1 << endl; 14 return 0; 15 }
B2. TV Subscriptions (Hard Version)
思路:尺取法,sum维护区间长度为d的元素不同的个数,用map记录区间变化时sum应该如何加减。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 2e6 +50; 4 int a[maxn]; 5 int main() 6 { 7 std::ios::sync_with_stdio(false); 8 int n, k, d; 9 int t; 10 cin >> t; 11 while(t--) 12 { 13 cin >> n >> k >> d; 14 map<int ,int > mp; 15 mp.clear(); 16 for(int i = 0;i < n;i++) cin >> a[i]; 17 int st = 0, ed = 0; 18 int ans = 0x3f3f3f3f; 19 int sum = 0; 20 for(ed = 0;ed < d;ed++){ 21 if(!mp[ a[ed] ]) sum++; 22 mp[ a[ed] ]++; 23 } 24 ans = min(ans, sum); 25 while(ed < n){ 26 if(!mp[ a[ed] ]) sum++; 27 mp[ a[ed] ]++; 28 mp[ a[st] ]--; 29 if(!mp[a[st]]) sum--; 30 st++; 31 ed++; 32 // cout << sum << endl; 33 ans = min(sum, ans); 34 } 35 cout << ans << endl; 36 } 37 38 return 0; 39 }
C. p-binary
思路:计算出当前的n至少分解成几个2的次幂,最多分解成n个1,所以判断答案在不在这区间内即可。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int cal(int n){ 5 if(n == 0) return 0; 6 else return n % 2 + cal(n / 2); 7 } 8 int main() 9 { 10 std::ios::sync_with_stdio(false); 11 int n, p; 12 cin >> n >> p; 13 int ans = 0; 14 while(n > 0) 15 { 16 n -= p; 17 ans ++; 18 if(ans >= cal(n)){ 19 if(ans > n) break; 20 else cout << ans << endl; 21 return 0; 22 } 23 } 24 cout << -1 << endl; 25 return 0; 26 }
D. Power Products
思路:对每个数进行质因数分解,如果a乘b等于某某的K次幂,也就是(a的每个质因子的幂次的指数) + (b的对应的质因子 的幂次的指数) 应该等于K,那么将每个数的质因数的幂次相乘进行双哈希,用map保存,每次查询对应的补集也就是(k - 每个数的质因子的幂次的指数%k).
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int mod1 = 1e9 + 7; 5 const int mod2 = 1e9 + 9; 6 const int maxn = 1e5 +50; 7 #define pii pair<int,int> 8 int a[maxn]; 9 bool vis[maxn]; 10 int prime[maxn]; 11 int n, k; 12 map<pii, int> mp; 13 ll ksm(ll a, ll b, int mod) 14 { 15 ll ans = 1; 16 while(b) 17 { 18 if (b & 1) 19 ans = ans * a % mod; 20 a = a * a % mod; 21 b >>= 1; 22 } 23 return ans %mod; 24 } 25 void init()//欧拉筛法 26 { 27 int num = 0; 28 memset(vis,true,sizeof(vis)); 29 for(int i = 2;i < maxn;i++) 30 { 31 if(vis[i]) 32 prime[++num] = i; 33 for(int j = 1;j <= num ;++j) 34 { 35 if(i*prime[j] > maxn) break; 36 vis[i*prime[j]] = false; 37 if(i % prime[j] == 0) //表示这个数已经被筛过了 38 break; 39 } 40 } 41 } 42 void solve(){ 43 init(); 44 cin >> n >> k; 45 ll ans = 0; 46 for(int i = 0;i < n;i++){ 47 cin >> a[i]; 48 ll x1 = 1, y1 = 1, x2 = 1, y2 = 1; 49 for(int j = 1;prime[j]* prime[j] <= a[i];j++){ 50 int cnt = 0 ; 51 while(a[i] % prime[j] == 0) a[i]/=prime[j],cnt++; 52 if(cnt % k){ 53 x1 = x1*ksm(prime[j], cnt % k, mod1) % mod1; 54 y1 = y1*ksm(prime[j], cnt % k, mod2) % mod2; 55 x2 = x2*ksm(prime[j], k - (cnt % k), mod1) % mod1; 56 y2 = y2*ksm(prime[j], k - (cnt % k), mod2) % mod2; 57 } 58 59 } 60 if(a[i] != 1){ 61 x1 = x1*ksm(a[i], 1, mod1) % mod1; 62 y1 = y1*ksm(a[i], 1, mod2) % mod2; 63 x2 = x2*ksm(a[i], k - 1, mod1) % mod1; 64 y2 = y2*ksm(a[i], k - 1, mod2) % mod2; 65 } 66 ans += mp[make_pair(x1, y1)]; 67 mp[make_pair(x2, y2)]++; 68 69 } 70 cout << ans << endl; 71 } 72 int main() 73 { 74 std::ios::sync_with_stdio(false); 75 solve(); 76 return 0; 77 }
以上是关于Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)
Codeforces Round #596 (Div. 2) ABCD题
Codeforces Round #596 div2 D. Power Products