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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

 

以上是关于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 题解

Codeforces Round #596 div2 D. Power Products

Codeforces Round #596 Div1 A~E题解

Codeforces Round #436 E. Fire(背包dp+输出路径)