https://codeforces.com/contest/1243
A題 給n個數, 問能構成最大的方形邊長,n<=1e3, 用個桶排 逆序輸出最大邊值
B1題 給兩個字符串 問只交換一次能否使兩字符串相等,直接模擬
B2題 給兩個長度為n的小寫字母字符串s t, 問能否交換兩個字符串中使得兩字符串相同 交換次數 小於 2n,
記錄下每個出現字母次數, 如果有奇數 則無法成功, 否則 每次以 s 的 字符 s[i] 進行枚舉, :
如果 i 後面s中的字符有 s[j] 等於 s[i]的, 則交換下 s[j] t[i],
還有一種情況是 s[i] 等於 t[j], 則先交換下 s[j] t[j], 再交換下 s[j] t[i],
最多 2n 種情況,每次的交換次序可以用 vector < pair<int, int> > 存下
C題 n <= 1e12, 給一個 n,需要給 1 ……n 塊塗上顔色, 每兩塊 i j 如果 |j - i| = x, x為 n 的非1因子 則 i j 兩塊顔色需要相同
問最多能有幾種顔色, 我理解的是如果 n 衹有 一個質因子 p 則 最多有 p 種顔色 塗成 1……p 1……p 這樣
如果有兩個或兩個以上質因子的話 比如 p q, 那任何數 m 都可以表示為 ap+bq = m,故所有的塊都為同色
#include <bits/stdc++.h> //cf599 div2 using namespace std; #define ll long long #define _for(i,a,b) for(int i = (a); i < (b); i++) #define _rep(i,a,b) for(int i = (a); i <= (b); i++) #define _per(i,a,b) for(int i = (a); i >= (b); i--) void taskA(){ int t,n; cin >> t; while (t--) { cin >> n; int a[1010] = {},x,ma,ret = 0; _rep(i,1,n) cin >> x, a[x]++; _per(i,n,1) { ret += a[i]; if(ret >= i) {ma = i; break;} }cout << ma << endl; } } void taskB(){ int t,n; cin >> t; while (t--) { cin >> n; cin.get(); string s1,s2; getline(cin, s1); getline(cin, s2); int x = 0, y = 0, cnt = 0; _for(i,0,n) { if(s1[i] != s2[i]) { cnt++; if(!x) x = i+1; else if(!y) y = i+1; } } if(x && y){ x--, y--; char c1 = s1[x], c2 = s2[y]; s1[x] = c2, s2[y] = c1; } //cout << c1 << " " << c2 << " " << s1 << " s2 = " << s2 <<endl; if((cnt==2 || cnt==0) && s1 == s2) cout << "Yes "; else cout << "No "; } } void taskC(){ int t,n; cin >> t; while (t--) { cin >> n; string s1,s2; cin.get(); cin >> s1 >> s2; int x = 0, y = 0, cnt = 0, cnt1[26] = {}, cnt2[26] = {}; _for(i,0,n) { cnt1[s1[i]-'a']++; cnt1[s2[i]-'a']++; } int flag = 0; _for(i,0,26) if(cnt1[i]&1) {flag = 1; break;} if(flag) cout << "No "; else { if(s1 == s2) continue; vector< pair<int, int> > ans; _for(i,0,n) _for(j,i+1,n) { if(s1[i] == s1[j]) { swap(s1[j], s2[i]); ans.push_back(make_pair(j, i)); break; } else if(s1[i] == s2[j]) { swap(s2[j], s1[n-1]); swap(s2[i], s1[n-1]); ans.push_back(make_pair(n-1, j)); ans.push_back(make_pair(n-1, i)); break; } } assert(s1==s2); cout << "Yes "; cout << ans.size() << endl; _for(i,0,ans.size()) cout << ans[i].first+1 << " " << ans[i].second+1 << endl; } } } void taskD(){ ll n; cin >> n; ll q = sqrt(n), cnt = n; _rep(i,2,q) { if(n%i) continue; while(n%i == 0) n /= i; //cout << " n = " << n << endl; if(n == 1) cout << i << endl; else cout << "1 "; return; } cout << n << endl; } int main(){ //taskA(); //taskB(); //freopen("output.txt", "w", stdout); //taskC(); taskD(); return 0; } /* 4 5 souse houhe 3 cat dog 2 aa az 3 abc bca */