题目链接: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 }
来源:oschina
链接:https://my.oschina.net/u/4361197/blog/3361299