2024牛客暑期多校训练营8

目录

赛时: A,K(我好想说我AK了,可惜我是弱鸡)

K:

A:

E:

叭叭一声:“我爱呆毛王”


赛时: A,K(我好想说我AK了,可惜我是弱鸡)

K:

        很明显,要么三个要么五个

#include<bits/stdc++.h>
#define endl '\n'
#define ll int
#define int int
#define double long double
#define Int __int128
#define pb push_back
#define eb emplace_back
#define MAX_LOG 21
#define ff first
#define ss second
#define M 5005
#define ull unsigned long long
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<ll,ll> PLL;
typedef pair<int,int>PII;
ll gcd(ll a,ll b)
{
    if(b) while((a%=b)&&(b%=a));
    return a+b;
}//最大公约数函数
ll spid(ll a,ll b,ll p)
{
    ll ans=1;
    while(b)
    {
        if(b&1)ans=ans*a%p;
        b>>=1;
        a=a*a%p;
    }
    return ans;
}//快速幂函数
///泡沫在阳光下闪烁,像星辰在寂静得夜空中闪耀

///秋雨
const ll N=2e5+10;
void solve()
{
    string s;cin>>s;
    ll n=s.size();
    s='.'+s;
    for(int i=1;i<=n;i++)
    {
        if(n-i+1>=5&&s[i]=='a'&&s[i+1]=='v'&&s[i+2]=='a'&&s[i+3]=='v'&&s[i+4]=='a')
        {
            i+=4;
        }else if(n-i+1>=3&&s[i]=='a'&&s[i+1]=='v'&&s[i+2]=='a')i+=2;
        else
        {
            cout<<"No\n";
            return;
        }
    }cout<<"Yes\n";
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t=1;
    cin>>t;
    while(t--)
    {
        solve();
    }
}
///在秋天邂逅, 在春天发芽,在夏天壮大,在秋天萧瑟,在冬天萎缩,

///而后,春天再度归来。

A:

        暴力枚举gcd即可,刚好过得去,嘻嘻

        

#include<bits/stdc++.h>
#define endl '\n'
#define ll int
#define int int
#define double long double
#define Int __int128
#define pb push_back
#define eb emplace_back
#define MAX_LOG 21
#define ff first
#define ss second
#define M 5005
#define ull unsigned long long
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<ll,ll> PLL;
typedef pair<int,int>PII;
ll gcd(ll a,ll b)
{
    if(b) while((a%=b)&&(b%=a));
    return a+b;
}//最大公约数函数
ll spid(ll a,ll b,ll p)
{
    ll ans=1;
    while(b)
    {
        if(b&1)ans=ans*a%p;
        b>>=1;
        a=a*a%p;
    }
    return ans;
}//快速幂函数
///泡沫在阳光下闪烁,像星辰在寂静得夜空中闪耀

///秋雨
const ll N=2e5+10;
ll a[N];
void solve()
{
    ll n;cin>>n;unordered_set<ll>st;
    for(int i=1;i<=n;i++)cin>>a[i],st.insert(a[i]);
    if(n==1)
    {
        cout<<"Haitang\n";
        return;
    }
    for(int i=1e5;i>=1;i--)
    {
        ll t=0;
        for(int j=1;j<=1e5;j++)
        {
            if(i*j>1e5)break;
            if(!st.count(i*j))continue;
            if(!t)t=j;
            t=gcd(t,j);
        }
        if(t==1)st.insert(i);
    }
    if(st.size()-n&1)cout<<"dXqwq\n";
    else cout<<"Haitang\n";
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t=1;
    cin>>t;
    while(t--)
    {
        solve();
    }
}
///在秋天邂逅, 在春天发芽,在夏天壮大,在秋天萧瑟,在冬天萎缩,

///而后,春天再度归来。

E:

        移项后就变成找到(n-s(m))%m==0的式子,然后去找对应的因数嘛,思路就这么简单,结果发现时间复杂度用我会的筛因子根本过不去,结果赛后发现有个巴拉巴拉算法可以dfs求因子,刚好对应大数的(赛时没搜着),然后思路一点没变,人家过了,我没过,呜呜呜~。这边贴一下暴力算法。

 

#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define int int
#define double long double
#define Int __int128
#define pb push_back
#define eb emplace_back
#define MAX_LOG 21
#define ff first
#define ss second
#define M 5005
#define ull unsigned long long
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<ll,ll> PLL;
typedef pair<int,int>PII;
ll gcd(ll a,ll b)
{
    if(b) while((a%=b)&&(b%=a));
    return a+b;
}//最大公约数函数
ll spid(ll a,ll b,ll p)
{
    ll ans=1;
    while(b)
    {
        if(b&1)ans=ans*a%p;
        b>>=1;
        a=a*a%p;
    }
    return ans;
}//快速幂函数
///泡沫在阳光下闪烁,像星辰在寂静得夜空中闪耀

///秋雨
const ll N=2e5+10;
ll a[N];
ll sum(ll x)
{
    ll ans=0;
    while(x)
    {
        ans+=x%10;
        x/=10;
    }
    return ans;
}
void solve()
{
    ll n;
    cin>>n;
    ll ans=0;
    for(int i=1; i<=108; i++)
    {
        for(int j=1; j*j<=n-i&&j<=108; j++)
        {
            if((n-i)%j==0)
            {
                if( (sum(j)==i) && (i!=j) )
                {
//                  cout<<i<<' '<<j<<'\n';
                    ans++;
                }
                if(sum((n-i)/j)==i && (j*j!=n-i) && (i!=(n-i)/j) )
                {
//                  cout<<i<<' '<<(n-i)/j<<'\n';
                    ans++;
                }
            }
        }
    }
    for(int i=109; i*i<=n; i++)
    {
        int res=n%i;
        if(res<=108)
        {
            if(sum(i)==res)
            {
//              cout<<res<<' '<<i<<'\n';
                ans++;
            }
            if(sum((n-res)/i)==res&&(i*i!=(n-res)))
            {
//              cout<<res<<' '<<(n-res)/i<<'\n';
                ans++;
            }
        }
    }
    cout<<ans<<'\n';
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t=1;
    cin>>t;
    while(t--)
    {
        solve();
    }
}
///在秋天邂逅, 在春天发芽,在夏天壮大,在秋天萧瑟,在冬天萎缩,

///而后,春天再度归来。

        但是肯定有别的解法,我放下面了,(会发现就是加了一些限制,就能跑了呜呜呜)

#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define int long long
#define double long double
#define Int __int128
#define pb push_back
#define eb emplace_back
#define MAX_LOG 21
#define ff first
#define ss second
#define M 5005
#define ull unsigned long long
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<ll,ll> PLL;
typedef pair<int,int>PII;
ll gcd(ll a,ll b)
{
    if(b) while((a%=b)&&(b%=a));
    return a+b;
}//最大公约数函数
ll spid(ll a,ll b,ll p)
{
    ll ans=1;
    while(b)
    {
        if(b&1)ans=ans*a%p;
        b>>=1;
        a=a*a%p;
    }
    return ans;
}//快速幂函数
///泡沫在阳光下闪烁,像星辰在寂静得夜空中闪耀

///秋雨
const ll N=2e5+10;
ll a[N];
ll sum(ll x)
{
    ll ans=0;
    while(x)
    {
        ans+=x%10;
        x/=10;
    }
    return ans;
}
void solve()
{
    ll n;
    cin>>n;
    ll ans=0;
    for(int i=1; i<=108; i++)
    {
        for(int j=1; j*j<=n-i&&j<=108; j++)
        {
            if((n-i)%j==0)
            {
                if( (sum(j)==i) && (i!=j) )
                {
//                  cout<<i<<' '<<j<<'\n';
                    ans++;
                }
                if(sum((n-i)/j)==i && (j*j!=n-i) && (i!=(n-i)/j) )
                {
//                  cout<<i<<' '<<(n-i)/j<<'\n';
                    ans++;
                }
            }
        }
    }
    for(int i=109; i*i<=n; i++)
    {
        int res=n%i;
        if(res<=108)
        {
            if(sum(i)==res)
            {
//              cout<<res<<' '<<i<<'\n';
                ans++;
            }
            if(sum((n-res)/i)==res&&(i*i!=(n-res)))
            {
//              cout<<res<<' '<<(n-res)/i<<'\n';
                ans++;
            }
        }
    }
    cout<<ans<<'\n';
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t=1;
    cin>>t;
    while(t--)
    {
        solve();
    }
}
///在秋天邂逅, 在春天发芽,在夏天壮大,在秋天萧瑟,在冬天萎缩,

///而后,春天再度归来。

如果按照原本的找因子的思路,那么就需要扣板子了,我放下边,dfs求出来的因子放在了ans数组里,如果你发现你尝试把下面这份代码变成你的代码,但是却只过了41%,那么应该是你快速幂没写好,因为数据范围大,1e18可能会暴long long(int64_t)

#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define int long long
#define double long double
#define Int __int128
#define pb push_back
#define eb emplace_back
#define MAX_LOG 21
#define ff first
#define ss second
#define M 5005
#define RI register int
#define CI const int&
#define ull unsigned long long
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<ll,ll> PLL;
typedef pair<int,int>PII;
ll gcd(ll a,ll b)
{
    if(b) while((a%=b)&&(b%=a));
    return a+b;
}//最大公约数函数
ll spid(ll a,ll b,ull p)
{
    ll ans=1;
    while(b)
    {
        if(b&1)ans=(Int)ans*a%p;
        b>>=1;
        a=(Int)a*a%p;
    }
    return ans;
}//快速幂函数
///泡沫在阳光下闪烁,像星辰在寂静得夜空中闪耀

///秋雨
const ll N=2e5+10;
bool check(const ll a,const ull p)
{
    ull d=p-1,get=spid(a,d,p);
    if(get!=1) return 1;//特判 d=p-1 的情况
    while((d&1)^1)
        if(d>>=1,(get=spid(a,d,p))==p-1) return 0;//先 d/=2,再计算快速幂
        else if(get!=1) return 1;
    return 0;
}
const ll test[]= {2,3,5,7,11,13,17,19,23,29,31,37};
bool miller_rabin(const ll p)
{
    if(p>40)
    {
        for(auto i:test)
            if(check(i,p)) return 0;
        return 1;
    }
    for(auto i:test)
        if(p==i) return 1;
    return 0;
}
mt19937 rng((unsigned int) chrono::steady_clock::now().time_since_epoch().count());
///产生随机数
ll pollard_rho(ll x)
{
    ll s=0,t=0;
    ll c=(ll)(rng())%(x-1)+1;
    ll val = 1;
    for(int goal=1; ;goal<<=1,s=t,val=1)
    {
        for (int step=1; step<=goal; step++)
        {
            t=((Int)(t)*t+c)%x;
            val=(Int)(val)*abs(t-s)%x;
            if(step%127==0)
            {
                ll g=gcd(val,x);
                if(g>1)
                {
                    return g;
                }
            }
        }
        ll g=gcd(val, x);
        if(g>1)
        {
            return g;
        }
    }
}

unordered_map<ll,ll> getprimes(ll x)
{
    unordered_map<ll,ll> p;
    function<void(ll)>get=[&](ll x)
    {
        if(x<2)
        {
            return;
        }
        if (miller_rabin(x))
        {
            p[x]++;
            return;
        }
        ll mx = pollard_rho(x);
        get(x/mx);
        get(mx);
    };
    get(x);
    return p;
}

vector<ll>getfac(ll x)///获取非凡因子
{
    vector<ll>fac;
    auto primes =getprimes(x);
    vector<PLL> tmp(primes.begin(),primes.end());
    ll len=tmp.size();
    function<void(ll,ll)>dfs=[&](ll st,ll x)
    {
        if(st==len)
        {
            fac.eb(x);
            return;
        }
        ll p = 1;
        for(int i=0; i<=tmp[st].ss; i++)
        {
            if (i != 0)
            {
                p *= tmp[st].ff;
            }
            dfs(st+1,x*p);
        }
    };
    dfs(0, 1);
    return fac;
}
ll sum(ll x)
{
    ll ans=0;
    while(x)
    {
        ans+=x%10;
        x/=10;
    }return ans;
}
void solve()
{
    ll n;
    cin >> n;
    vector<ll>ans;
    for(int i=1; i<=109; i++)
    {
        if(i>n)
        {
            break;
        }
        auto v=getfac(n-i);
        for(auto &m :v)
        {
            if (n%m==sum(m))
            {
                ans.eb(m);
            }
        }
    }
    sort(ans.begin(), ans.end());
    ans.erase(unique(ans.begin(), ans.end()), ans.end());///去重
    ///求出来的因子
    cout<<ans.size()<<'\n';
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t=1;
    cin>>t;
    while(t--)
    {
        solve();
    }
}
///在秋天邂逅, 在春天发芽,在夏天壮大,在秋天萧瑟,在冬天萎缩,

///而后,春天再度归来。

J:

        发现i,i+n/3 ,i+2*n/3是个非三角序列,i,i+1,i+2是个合法三角序列,那么就可以根据题目去构造这个数组。然后再对数组进行微调即

#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define int long long
#define double long double
#define Int __int128
#define pb push_back
#define eb emplace_back
#define MAX_LOG 21
#define ff first
#define ss second
#define M 5005
#define RI register int
#define CI const int&
#define ull unsigned long long
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<ll,ll> PLL;
typedef pair<int,int>PII;
ll gcd(ll a,ll b)
{
    if(b) while((a%=b)&&(b%=a));
    return a+b;
}//最大公约数函数
ll spid(ll a,ll b,ull p)
{
    ll ans=1;
    while(b)
    {
        if(b&1)ans=(Int)ans*a%p;
        b>>=1;
        a=(Int)a*a%p;
    }
    return ans;
}//快速幂函数
///泡沫在阳光下闪烁,像星辰在寂静得夜空中闪耀

///秋雨
const ll N=2e5+10;
vector<ll> get_vec(ll n)
{
    vector<ll>res;
    if(n%3)res.eb(n-n%3+1);
    ll t=n/3;
    for(int i=t; i; i--)
    {
        res.eb(i);
        res.eb(i+t);
        res.eb(i+2*t);
    }
    if(n%3==2)res.eb(n);
    return res;
}
void solve()
{
    ll n,k;cin>>n>>k;
    if(k>=n-2)
    {
        cout<<-1<<'\n';
        return;
    }
    vector<ll>ans=get_vec(n-k);
    for (int i=n-k+1; i<=n; i++) ans.push_back(i);
    if ((n-k)%3==1 && k>0) swap(ans[0], ans[n-k]);
    bool ret=1;
    for(int x:ans)
        cout << x << ' ';cout << '\n';

}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t=1;
    cin>>t;
    while(t--)
    {
        solve();
    }
}
///在秋天邂逅, 在春天发芽,在夏天壮大,在秋天萧瑟,在冬天萎缩,

///而后,春天再度归来。

叭叭一声:“我爱呆毛王”

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值