Codeforces Round #630 (Div. 2)(A~E)
B. Composite Coloring
题目链接
题意:
让你为n个数染色,要让相同颜色的两个数的gcd > 1 , 问怎么染, 题目保证可以让使用的颜色不大于11种。
思路:
偶数 :染颜色1
奇数 ; 染他的最小质因子的指定色
#include <bits/stdc++.h> using namespace std; const int maxn = 2e3 + 10; #define ll long long #define ios std::ios::sync_with_stdio(false) #define int long long typedef unsigned long long ULL; int a[maxn]; int ans[maxn]; vector<int> su; map<int ,int>ma; signed main() { ios; cin.tie(0);/// su.clear(); su.push_back(2);///存1 ~ 1000以内的素数 for(int i = 3 ; i < 1000 ; i += 2){ bool ok = true; for(int j = 2 ; j < i - 1 ; j ++){ if(i % j == 0){ ok = false ; break; } } if(ok)su.push_back(i); } int t; cin >> t; while(t --){ ma.clear(); int n; cin >> n; for(int i = 1 ; i <= n ; i ++){ cin >> a[i]; ans[i] = 0; } int cnt = 1; for(int i = 1 ; i <= n ; i ++){ for(int j = 0 ; j < su.size() ; j ++){ if(a[i] % su[j] == 0){ if(ma[su[j]] == 0)ma[su[j]] = cnt , cnt ++;///map存该素数对应颜色 ans[i] = ma[su[j]]; break; } } } for(int i = 1 ; i <= n ; i ++){ if(ans[i] == 0){ ans[i] = cnt , cnt ++; } } cout << cnt - 1 << '\n'; for(int i = 1 ; i <= n ; i ++){ cout << ans[i] << ' '; } cout << '\n'; } return 0; }
C. K-Complete Word
题目链接
题意:
给你个字符串,你可以操作让其中一个字符变为任意一个字符,问你要最少进行多少次操作才能让这个字符串变成一个周期为k的,且在一个周期内为回文的字符串。
即使S(1 ~ k) = S(k + 1 ~ k + k)=...... 且子串S(1 ~k) 是回文。
思路:
遍历字符串,算每个字符的贡献。
如:查看s(1) , s(k + 1) , s(2 * k + 1) ....哪个字符出现次数最多,就用这个字符,作整个字符串转变后的第一位的字符。
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 10; #define ll long long #define ios std::ios::sync_with_stdio(false) #define int long long char ch[maxn]; int cnt[maxn][30]; char ans[maxn]; signed main() { ios; cin.tie(0);/// int t; cin >> t; while(t --){ int n , k; cin >> n >> k; cin >> ch + 1; for(int i = 0 ; i <= n ; i ++){ for(int j = 0 ; j < 30 ; j ++){ cnt[i][j] = 0;///初始化 } } for(int i = 1 ; i <= n ; i += k){ for(int j = i ; j < i + k ; j ++){ cnt[j - i + 1][ch[j] - 'a'] ++; } } for(int i = 1 ; i <= (k + 1) / 2 ; i ++){ int maxx = -1 , pos = -1; for(int j = 0 ; j < 30 ; j ++){ cnt[i][j] += cnt[k - i + 1][j];///对折了一下,因为是回文 if(maxx < cnt[i][j]){ maxx = cnt[i][j]; pos = j; } } ans[i] = ('a' + pos); } for(int i = 1 ; i <= (k + 1) / 2 ; i ++){ ans[k - i + 1] = ans[i]; } int c = 0; for(int i = 1 ; i <= n ; i += k){ for(int j = i ; j < i + k ; j ++){ if(ans[j - i + 1] != ch[j])c ++; } } cout << c << '\n'; } return 0; }