首页 > 其他分享 >2024牛客多校第八场

2024牛客多校第八场

时间:2024-08-08 21:38:54浏览次数:14  
标签:10 return int ll 多校 long 2024 牛客 ret

E

观察到s(m)<=108,所以r是可以枚举的

但是枚举完后再开根号,时间复杂度为O(T*r*sqrt(n))≈O(100*100*1e6)

赛时还想了一种自认为更优的做法。

考虑枚举i,枚举完i就能得到r,判断是否满足条件(当然,就像分解质因数那样,n/i也要判断)

然后直接这么写会出点小问题,比如11=10*1+1,i=1时11%1=0

在i比较小时,再从1-108枚举r即可。

这么做是O(Tsqrt(n))的,可惜卡了很久常数没卡过。

放一份代码纪念一下:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6+5;
int S[N];
int cal(int x){
    int ret=0;
    while(x){
        ret=ret+x%10;
        x/=10;
    }
    return ret;
}
int s(int x){
    if(x<N) return S[x];
    else {
        int a1=x/1000000;
        int a2=x%1000000;
        return S[a1]+S[a2];
    }
}
void solve(){
    int n;cin>>n;
    int up=sqrt(n),ans=0;
    for(int i=1;i<=up;i++){
        
        if(i>108){
            int r=n%i;
            if(r==s(i)) ans++;
            if(i*i!=(n-r)){
                if( r<((n-r)/i) && r==s((n-r)/i)) ans++;
            }    
        }
        else {
            for(int r=1;r<=108;r++){
                if(  r<i && r<n && (n-r)%i==0 && r==s(i) ) {
                //    cout<<i<<" "<<r<<"\n";
                    ans++;
                //    cout<<"ans: "<<ans<<endl;
                }
                if(i*i!=(n-r)){
                    if( r<((n-r)/i) && r<n && (n-r)%i==0 && r==s((n-r)/i) ) {
                //        cout<<(n-r)/i<<" "<<r<"\n";
                        ans++;
                //        cout<<"ans2: "<<ans<<endl;
                    }
                }
            }
        }
    }
    cout<<ans<<"\n";
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    for(int i=1;i<N;i++) S[i]=cal(i);
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}

但现场过的队伍基本是直接枚举r,然后分解质因数用Pollard_Rho算法实现,跑了300ms直接冲过了

就变成了一道无趣的PR板子题

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=998244353;
int ksm(int a,int b){
    int ret=1;a%=MOD;
    for(;b;b>>=1,a=(ll)a*a%MOD)if(b&1)ret=(ll)ret*a%MOD;
    return ret;
}
long long ksm(long long a,long long b,long long p){
    long long ret=1;
    for(;b;b>>=1,a=(__int128)a*a%p)
        if(b&1)ret=(__int128)ret*a%p;
    return ret;
}
bool Miller_Rabin(long long p){
    if(p<3||(p&1)==0)return p==2;
    long long s,a,k=0,t=p-1;
    while(!(t&1)){
        t>>=1;
        k++;
    }
    for(int tc=1;tc<=9;tc++){
        a=rand()%(p-2)+2;//生成[2,p-1]的质数
        s=ksm(a,t,p);
        if(s==1||s==p-1)continue;
        for(int i=0;i<k-1;i++){
            s=(__int128)s*s%p;
            if(s==p-1)break;
        }
        if(s!=p-1)return 0;
    }
    return 1;
}
long long Pollard_Rho(long long x){
    long long s=0,t=0;
    long long c=(long long)rand()%(x-1)+1;
    int step=0,goal=1;
    long long val=1;
    for(goal=1; ;goal<<=1,s=t,val=1){
        for(step=1;step<=goal;step++){
            t=((__int128)t*t+c)%x;
            val=(__int128)val*abs(t-s)%x;
            if(step%127==0){
                //隔一段时间算一次
                long long d=gcd(val,x);
                if(d>1)return d;
            }
        }
        long long d=gcd(val,x);
        if(d>1)return d;
    }
}

// decom存放的是质因数
vector<long long> decom;

void solve(long long x){
    if(x<2)return;
    if(Miller_Rabin(x)){
        decom.push_back(x);// 这里的x是质因数
        return;
    }
    long long p=x;
    while(p>=x)p=Pollard_Rho(x);//may be p=x;
    while(x%p==0)x/=p;
    solve(x);solve(p);
}
int S(ll x){
    int ret=0;
    while(x){ret+=x%10;x/=10;}
    return ret;
}
ll p[105],q[105],ans=0;
void dfs(int step,ll m,int r){
    if(step==(int)decom.size()+1){
        if(m>r && r==S(m)) ans++;    
        return;
    }
    dfs(step+1,m,r);
    ll tmp=1;
    for(int i=1;i<=q[step];i++){
        tmp*=p[step];
        dfs(step+1,m*tmp,r);
    }
}
void work(){
    ll n;cin>>n;
    ans=0;
    for(int r=1;r<=108;r++){
        ll t=n-r;
        decom.clear();
        solve(t);
        int cnt=0;
        memset(p,0,sizeof p);
        memset(q,0,sizeof q);
        for(auto v:decom){
            p[++cnt]=v;
            //cout<<v<<" ";
            while(t%v==0){
                t/=v;
                q[cnt]++;
            }
        }
        dfs(1,1,r);
    //    if(decom.size()) cout<<"\n r="<<r<<"\n";
    }
    cout<<ans<<"\n";
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t;cin>>t;
    while(t--){
        work();
    }
}

PR算法可以参考:

Pollard Rho算法_rollard rho-CSDN博客

Pollard-Rho - BBD186587 - 博客园 (cnblogs.com)

 

K

队友签到的

#include<bits/stdc++.h>
using namespace std;
const int N=5e5;
string s;
int n;
bool f[N+5];
void Kafka()
{
    cin>>s;
    n=s.length();
    s='?'+s;
    f[0]=1;
    for(int i=1;i<=n;++i)
    {
        string tmp="";
        f[i]=0;
        for(int j=0;j<=4;++j)
        {
            if(i-j<1) break;
            tmp=s[i-j]+tmp;
            if(j==2&&tmp=="ava"&&f[i-j-1]) f[i]=1;
            if(j==4&&tmp=="avava"&&f[i-j-1]) f[i]=1;
        }
//        cout<<"f["<<i<<"]="<<f[i]<<'\n';
    }
    cout<<(f[n]?"Yes":"No")<<'\n';
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int T;
    for(cin>>T;T--;) Kafka();
    return 0;
}

 

A

首先发现最终状态是确定的,过程中怎么拿并不影响最终状态。

所以其实是一道诈骗题,算出能操作几次然后判奇偶即可。

考虑从1到n枚举i,若i最终能出现在终态里,则序列a中一定存在一些数,它们的gcd=i

(显然这些数也要是i的倍数)

复杂度看起来是Nloglog的,但实际上跑不满。

#include<bits/stdc++.h>
using namespace std;

inline int read()
{
    int x=0;bool f=1;char ch=getchar();
    for(;ch<'0'||ch>'9';ch=getchar())f^=(ch=='-');
    for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
    return f?x:-x;
}
const int N=1e5+5;
int gcd(int x,int y){
    if (y==0) return x;
    return gcd(y,x%y);
}
int n;
int d[N];
void work(){
    cin >> n;
    int cnt=0;
    for (int i=1;i<N;i++)
        d[i]=0;
    for (int i=1;i<=n;i++){
        int x;
        cin >> x;
        d[x]=1;
    }
    for (int i=1;i<N;i++){
        if (d[i]) continue;
        int tmp=0;
        for (int j=i*2;j<N;j+=i){
            //cerr << "j=" << j << endl;
            if (d[j]) tmp=gcd(j,tmp);
            if (tmp==i){
                //cerr << "i=" << i << endl;
                cnt++;
                break;
            }            
        }
    }
    if (cnt&1) cout << "dXqwq" << endl;
        else cout << "Haitang" << endl;
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int T;
    cin >> T;
    while(T--) work();
    return 0;
}

 

J

这种题有一个trick:考虑能构造出的满足条件的区间数目的上界和下界,然后再进行调整

先想办法构造出长为(n-m)的序列,并且不能构成三角形

然后末尾按x+1 x+2 x+3加入,这样保证一定能新凑出m个三角形。

现在问题变成给定x,如何构造一个[1,x]的排列使得不能构成三角形。

1.x%3=0

可以把x分成3组,比如x=9,有如下构造:

1  4  7,2  5  8,3  6  9

2.x%3=1

同理可以把x分成3组,比如x=10,有如下构造:

1  4  7,2  5  8,3  6  9

那10怎么办?直接塞在最前面得到

10  ,1  4  7,2  5  8,3  6  9

3.x%3=2

同理,把最大的两个塞到前面去,比如x=11

11  10  ,1  4  7,2  5  8,3  6  9

然后就做完了

#include<bits/stdc++.h>
using namespace std;
const int N = 4e5+5;
int a[N];
void solve(){
    int n,m;cin>>n>>m;
    if(m>n-3) {
        cout<<-1<<"\n";
        return;
    }
    int k=n-m;
    if(k%3==0){
        int group=k/3;
        for(int i=1,d=1;i<=group;i++,d++){
            a[(i-1)*3+1]=d;
        }
        for(int i=1,d=group+1;i<=group;i++,d++){
            a[(i-1)*3+3]=d;
        }
        for(int i=1,d=2*group+1;i<=group;i++,d++){
            a[(i-1)*3+2]=d;
        }
        for(int i=3*group+1;i<=n;i++) a[i]=i;
        for(int i=1;i<=n;i++) cout<<a[i]<<" ";
        cout<<"\n";
    }
    else if(k%3==1){
        int group=k/3;
        for(int i=1,d=1;i<=group;i++,d++){
            a[(i-1)*3+1]=d;
        }
        for(int i=1,d=group+1;i<=group;i++,d++){
            a[(i-1)*3+3]=d;
        }
        for(int i=1,d=2*group+1;i<=group;i++,d++){
            a[(i-1)*3+2]=d;
        }
        cout<<n<<" ";
        for(int i=1;i<=group*3;i++) cout<<a[i]<<" ";
        
        for(int d=3*group+1;d<n;d++) cout<<d<<" ";
        cout<<"\n";
    }
    else {
        int group=k/3;
        for(int i=1,d=1;i<=group;i++,d++){
            a[(i-1)*3+1]=d;
        }
        for(int i=1,d=group+1;i<=group;i++,d++){
            a[(i-1)*3+3]=d;
        }
        for(int i=1,d=2*group+1;i<=group;i++,d++){
            a[(i-1)*3+2]=d;
        }
        cout<<n<<" "<<n-1<<" ";
        for(int i=1;i<=group*3;i++) cout<<a[i]<<" ";
        
        for(int d=3*group+1;d<=n-2;d++) cout<<d<<" ";
        cout<<"\n";
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t;
    cin>>t;
    while(t--) solve();
}

 

标签:10,return,int,ll,多校,long,2024,牛客,ret
From: https://www.cnblogs.com/liyishui2003/p/18349796

相关文章

  • win7一键修复所有dll缺失详细方法,7个dll修复方法深度解析(2024)
    dll文件是一种包含函数和其他关键信息的文件,供Windows应用程序使用。虽然大多数普通用户对.dll文件的具体工作原理并不熟悉,但这些文件对于系统应用来说是至关重要的。通常情况下,人们在遇到因DLL文件缺失或损坏而导致的错误时,才会接触到它们。对于非专业用户来说,理解这些错......
  • 牛客多校 A 题题解
    牛客多校8-AHaitangandGameGivenaset\(\textstyleS\),dXqwqandHaitangtaketurnsperformingthefollowingoperations,withdXqwqgoingfirst:Findapair\(\textstyle(x,y)\)suchthat\(\textstylex,y\inS\)and\(\textstyle\gcd(x,y......
  • 2024年最新免费AI大模型API汇总及国内大模型使用教程(附代码)
    免费大模型API一览大模型免费版本免费限制控制台(api_key等)API文档讯飞星火大模型spark-litetokens:总量无限;QPS:2;(每秒发送的请求数)有效期:不限访问链接访问链接百度千帆大模型平台ERNIE-Speed-8KRPM=300,TPM=300000(RPM是每分钟请求数(RequestsPerMinute),TPM是指每分......
  • 第二十天的学习(2024.8.8)Vue拓展
    昨天的笔记中,我们进行的项目已经可以在网页上显示查询到数据库中的数据,今天的笔记中将会完成在网页上进行增删改查的操作 1.删除表中数据现在网页上只能呈现出数据库中的数据,我们首先添加一个删除按钮,使其可以对数据库数据进行删除操作<template#default="scope"><e......
  • GMOJ 8101. 【2024年SD省队集训Day8】 正交向量
    效率时间复杂度:\(O(Tn\times3^9\times9)\)。没有任何卡常,能在\(1.08\)s内过hack.txt,而CHJ的代码在同样情况下跑了\(39\)s,LZY要用\(34\)s,PWX要用\(75\)s。但是在GMOJ上要用\(770\)ms,是目前比较劣的解。思路以下关于数字的第几位都是从\(0\)开始,从最低位到最......
  • 2024北京集训trick合集
    atcoderARC092F给定一张\(n\)个点\(m\)条边的有向图,判断每一条边反向后是否改变图中强连通分量的数量。数据范围:\(n\le1000\\\\m\le200000\)先跑一遍tarjan,然后问题转化为判断每个直接相连的两点在不经过其连边的情况下是否互通。对每个点dfs维护前缀和后缀能否回......
  • 2024睿抗机器人开发者大赛(RAICOM) CAIP编程技能赛 国一
    最后91分,国一。前几题都AK了,最后一题先是输出0,得了个1分。花了一个小时都没解决这题,难受ing,其实到最后差不多要改对了(降落那一部分没时间改),但是没时间了,hhhh。拿到国一,简直圆梦啦!!!本科拿的国三,差0.02秒就是国二,从此内心蒙上阴影。哭死ing研一终于拿了个编程比赛的国一,也算......
  • 2024年深圳市工业设计发展扶持计划申报时间
    为了进一步提升深圳市工业设计水平,加快工业设计与制造业的深度融合,2024年深圳市工业设计发展扶持计划现已全面启动。该计划旨在通过资金支持、政策优惠等多种方式,鼓励和支持工业设计企业及个人进行技术创新和产品开发,以增强深圳工业设计在全球市场的竞争力。对于符合条件的企业......
  • 2024年苏州市跨国公司地区总部和功能性机构申报临近截止时间
    苏州市跨国公司地区总部和功能性机构申报的截止时间已经迫在眉睫——8月12日。对于尚未提交申报材料的企业,现在是时候加快步伐,把握这最后的申报机会了。项目介绍苏州市一直致力于吸引和培育跨国公司地区总部及功能性机构,以推动外资总部经济的发展。截至目前,苏州已成功吸引了......
  • 2024年度勘察设计注册工程师资格考试报考条件
    2024年度勘察设计注册工程师资格考试报考条件一.注册土木工程师(岩土)资格考试条件(一)参加注册土木工程师(岩土)基础考试,应具备下列条件之一:⑴取得本专业或相近专业大学本科及以上学历或学位。⑵取得本专业或相近专业大学专科学历,从事岩土工程专业工作满1年。⑶取得其他工科专......