cf599 div2 a/b1/b2/c

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
*/
原文地址:https://www.cnblogs.com/163467wyj/p/11839198.html