CodeTON Round 9 (Div. 1 + Div. 2, Rated, Prizes!](A~D)

书面發表於2024-11-25

比賽連結 :CodeTON Round 9 (Div. 1 + Div. 2, Rated, Prizes!

A. Shohag Loves Mod

題目大意: 找到一個遞增整數序列\(1 \le a_1 \lt a_2 \lt \ldots \lt a_n \le 100\),所有 \(1 \le i \lt j \le n\)都滿足\(a_i \bmod i \neq a_j \bmod j\) \(^{\text{}}\)

void solve()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)cout<<i+i-1<<' ';
    cout<<endl;         
}

B. Shohag Loves Strings
題目大意: 給你一個字串s,問s中是否存在一個非空子串p,且p的非空字串數量為偶數.
思路: 考慮兩種情況\(aa\)|| \(abc\) 2種形式的字串.然後遍歷S看是否有這兩種形式的字串.

void solve() {
    string s;
    cin >> s;
    for (int i = 0; i + 1 < s.size(); i++) {
        if (s[i] == s[i + 1]) {
            cout << s.substr(i, 2) << endl;
            return;
        }
    }
      for (int i = 0; i + 2 < s.size(); i++) {
        string p = s.substr(i, 3);
        if (p[0] != p[1] &&p[0] != p[2]&&p[1] != p[2]) {
            cout << p << endl;
            return;
        }
    }
    cout << -1 << endl;
}

C1. Shohag Loves XOR (Easy Version)
題目大意: Shohag有兩個整數\(x\) and \(m\),幫助他計算整數y\(1 \le y \le m\)的數量,使得\(x \oplus y\)是兩者之一的除數

思路: 如果y的二進位制位數比x高一位那麼x⊕y>x 不可能是x的約數 且x⊕y 與y有相同的最高位也不可能是y的約數,所有y的範圍被縮小到\(m=min(m,x<<1)\),那麼y直接從1遍歷到m即可

void solve()
{
   ll x,m;cin>>x>>m;
   m=min(m,x<<1);
   ll res=0;
   for(int i=1;i<=m;i++)
   {
       if(i==x)continue;
       ll num=x^i;
       if(x%num==0||i%num==0)res++;
       
   }
    cout<<res<<endl;                      
}

D.Shohag Loves GCD
題目大意: 給你有個包含m個且不重複的整數集合S,讓你構造出長度為n的字典序最大的整數陣列\(a_1, a_2, \ldots, a_n\),並且使得對於每個 \(1 \le i \le n\),\(a_i \in S\),並且對於所有\(1 \le i \lt j \le n\) 的所有對都滿足\(a_{\operatorname{gcd}(i, j)} \neq \operatorname{gcd}(a_i, a_j)\)\(^{\text{†}}\)

思路: 我們從前往後遍歷,列舉所有下標 j 只要前面從1到 j 的所有下表都滿足 \(gcd⁡(i,j)≠gcd⁡(a_i,a_j)\)如果有一個不滿足,我們就讓等於集合中第一個小於的數 我們到最後得到的陣列就是字典序最大的。

假設 \(j = 2\),那麼有可能會讓\(gcd⁡(i,j)≠gcd⁡(a_i,a_j)\) 不成立的數只有下標\(1\)

​假設\(j = 3\),那麼有可能讓這個性質不成立的下標有1,因為1 2 兩個數對 3 的最大公約數都是1

​假設\(j=4\),那麼列舉之前所有下標\(gcd(1,4) = 1\),\(gcd(2,4) = 2\),$gcd(3,4) = 1 $可能讓題目性質不成立的下標有下標\(1\),下標\(2\)

​假設\(j = 6\),\(gcd(1,6) = 1\),\(gcd(2,6) = 2\)\(gcd(3,6) = 3\),\(gcd(4,6) = 2\),\(gcd(5,6) = 1\)

​假設\(j = 8\),\(gcd(1,8) = 1\)\(gcd(2,8) = 2\),\(gcd(3,8) = 1\),\(gcd(4,8) = 4\),\(gcd(5,8) = 1\),\(gcd(6,8) = 2\),\(gcd(7,8) = 1\)
這樣我們就得到了約數\(a_j\)的下標
\(j = 2:1\)

\(j = 3:1\)

\(j = 4:1,2\)

\(j = 6:1,2,3\)

\(j = 8:1,2,4\)
我們可以發現,所有對\(j\)有影響的下標都是\(j\)的約數,如果我們每次進入一個下標就求一次一個下標的所有約數是會超時的,我們又可以發現,當我們\(j = 2\)是最大約數是\(1\),\(j = 4\)時最大約數是\(2\),\(j = 8\)時最大約數是\(4\),只要\(j\)下標的值不同於\(j\)的最大約數這個下標就行了,求最大約數我們只需要找到\(j\)的最小質因子\(p\),然後最大約數就是\(j / p\),我們讓\(ans_j\)的值是a[p] 在集合s中第一個小於\(ans_p\)的值即可,如果沒用比\(ans_p\)更小的值,那麼就不能構造這個答案陣列,輸出\(-1\)

// Problem: D. Shohag Loves GCD
// Contest: Codeforces - CodeTON Round 9 (Div. 1 + Div. 2, Rated, Prizes!)
// URL: https://codeforces.com/contest/2039/problem/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define inf 0x3f3f3f3f
#define infll 0x3f3f3f3f3f3f3f3fLL
using ll=long long;
using i128=__int128;
using vi=vector<int>;
using vll=vector<ll>;
using vb=vector<bool>;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll,ll>pll ;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
int power(int x,int y,int p){int res=1;x=x%p;while(y>0){if(y&1)res=(1ll*res*x)%p;y>>=1;x=(1ll*x*x)%p;}return res;}
ll mod_inv(ll x,ll p){return power(x,p-2,p);}
ll ceilDiv(ll n,ll m){if(n>=0)return (n+m-1)/m;else return n/m;}

vector<int> minp, primes;

void sieve(int n)
{
    minp.assign(n + 1, 0);
    primes.clear();
    
    for (int i = 2; i <= n;i ++)
    {
        if(minp[i] == 0)
        {
            minp[i] = i;
            primes.push_back(i);
        }

        for(auto p : primes)
        {
            if(i * p > n)
                break;  

            minp[i * p] = p;
            if(p == minp[i])
                break;
        }   
    }
}

void solve() {
    int n,m;
    cin>>n>>m;
    vector<int> a;
    map<int,int> st;
    a.pb(0);
    for(int i = 0;i < m;i ++)
    {
        int x;
        cin>>x;
        a.pb(x);
    }
    sort(a.begin() + 1,a.end());
    for(int j = 1;j <= m;j ++)
    {
        st[a[j]] = j;
    }
    
    vector<int> b(n + 1,a.back());
    for(int i = 2;i <= n;i ++)
    {
        int p = minp[i],mark = 1;
        p=i/p;
        mark = st[b[p]] - 1;
        if(mark <= 0)
        {
            cout<<-1<<endl;
            return;
        }

        b[i] = a[mark];
    }    
    for(int i = 1;i <= n;i++)
    {
        cout<<b[i]<<" ";
    }
    cout<<endl;
    
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    sieve(1e5 + 10);
    int n;cin>>n;while(n --)
     solve();

    return 0;
}

別問為什麼沒有c2因為還不會,第一次藍名錶現這一把上大分

相關文章