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

比赛链接 :CodeTON Round 9 (Div. 1 + Div. 2, Rated, Prizes!

A. Shohag Loves Mod

题目大意: 找到一个递增整数序列1a1<a2<<an100,所有 1i<jn都满足aimodiajmodj

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,帮助他计算整数y1ym的数量,使得xy是两者之一的除数

思路: 如果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的字典序最大的整数数组a1,a2,,an,并且使得对于每个 1in,aiS,并且对于所有1i<jn 的所有对都满足agcd(i,j)gcd(ai,aj)

思路: 我们从前往后遍历,枚举所有下标 j 只要前面从1到 j 的所有下表都满足 gcd(i,j)gcd(ai,aj)如果有一个不满足,我们就让等于集合中第一个小于的数 我们到最后得到的数组就是字典序最大的。

假设 j=2,那么有可能会让gcd(i,j)gcd(ai,aj) 不成立的数只有下标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)=2gcd(3,6)=3,gcd(4,6)=2,gcd(5,6)=1

​假设j=8,gcd(1,8)=1gcd(2,8)=2,gcd(3,8)=1,gcd(4,8)=4,gcd(5,8)=1,gcd(6,8)=2,gcd(7,8)=1
这样我们就得到了约数aj的下标
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,我们让ansj的值是a[p] 在集合s中第一个小于ansp的值即可,如果没用比ansp更小的值,那么就不能构造这个答案数组,输出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因为还不会,第一次蓝名表现这一把上大分

posted @   书面  阅读(64)  评论(5编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示