Loading [MathJax]/extensions/TeX/mathchoice.js

牛客OI赛制测试赛3游记

A - 数字权重

题目大意:

一个n位的数字。设第i位的数为ai,其中a1为最高位,an为最低位,k为给定的数字。求同时满足满足以下两个条件的数的个数:

  1. 不含前导0
  2. ni=2(aiai1)=k

n,|k|1013

思路:

对和式稍加变形得ana1=k,因此我们只需要考虑a1an,其余数位09随便放即可。

源代码:

#include<cstdio>
#include<cctype>
#include<algorithm>
using int64=long long;
inline int64 getint() {
    register char ch;
    register bool neg=false;
    while(!isdigit(ch=getchar())) neg|=ch=='-';
    register int64 x=ch^'0';
    while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    return neg?-x:x;
}
constexpr int mod=1e9+7;
inline int power(int a,int64 k) {
    int ret=1;
    for(;k;k>>=1) {
        if(k&1) ret=(int64)ret*a%mod;
        a=(int64)a*a%mod;
    }
    return ret;
}
int main() {
    const int64 n=getint(),k=getint();
    if(std::abs(k)>9) {
        puts("0");
        return 0;
    }
    int ans=power(10,n-2);
    if(k>=0) ans=ans*(9-k)%mod;
    if(k<0) ans=ans*(10+k)%mod;
    printf("%d\n",ans);
    return 0;
}

B - 毒瘤xor

CC-XXOR

C - 硬币游戏

题目大意:

A和B各有一行长度为2n(n106)的01序列,A先取,每次只能取两个人之前都没取过的位置,这样n次后两个人就得到了长度为n的数字串,谁的字典序大谁就赢了。若两人都按照最优策略,问最后谁赢(或平手)。

思路:

每次贪心取未被选择位置上的1,如果有很多1那么优先取对方也是1的。用堆来维护,时间复杂度O(nlogn)

源代码:

#include<queue>
#include<cstdio>
#include<cctype>
inline int getint() {
    register char ch;
    while(!isdigit(ch=getchar()));
    register int x=ch^'0';
    while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    return x;
}
inline bool getval() {
    register char ch;
    while(!isalpha(ch=getchar()));
    return ch=='U';
}
const int N=2e6+1;
bool a[N],b[N],mark[N];
struct Node {
    bool a,b;
    int id;
    bool operator < (const Node &rhs) const {
        if(a^rhs.a) return !a;
        if(b^rhs.b) return !b;
        return id<rhs.id;
    }
};
std::priority_queue<Node> q[2];
int main() {
    const int n=getint();
    for(register int i=1;i<=n*2;i++) a[i]=getval();
    for(register int i=1;i<=n*2;i++) b[i]=getval();
    for(register int i=1;i<=n*2;i++) {
        q[0].push((Node){a[i],b[i],i});
        q[1].push((Node){b[i],a[i],i});
    }
    for(register int i=1;i<=n;i++) {
        while(mark[q[0].top().id]) q[0].pop();
        a[i]=q[0].top().a;
        mark[q[0].top().id]=true;
        while(mark[q[1].top().id]) q[1].pop();
        b[i]=q[1].top().a;
        mark[q[1].top().id]=true;
    }
    for(register int i=1;i<=n;i++) {
        if(a[i]==b[i]) continue;
        puts(a[i]?"clccle trl!":"sarlendy tql!");
        return 0;
    }
    puts("orz sarlendy!");
    return 0;
}

D - 粉樱花之恋

题目大意:

求斐波那契数列前n(n1018)项和。

思路:

找规律可以发现前n项和F(n)=f(n+3)1,因此直接矩阵快速幂或者折半公式即可。

时间复杂度O(nlogn)

源代码:

#include<cstdio>
#include<cctype>
#include<unordered_map>
using int64=long long;
inline int64 getint() {
    register char ch;
    while(!isdigit(ch=getchar()));
    register int64 x=ch^'0';
    while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    return x;
}
const int64 mod=998244353;
std::unordered_map<int64,int> m;
inline int64 sqr(const int64 &x) {
    return x*x;
}
int64 f(const int64 &n) {
    if(m[n]) return m[n];
    if(n==1||n==2) return m[n]=1;
    if(n&1) return m[n]=(sqr(f(n/2+1))+sqr(f(n/2)))%mod;
    return m[n]=(f(n/2-1)*2+f(n/2))*f(n/2)%mod;
}
int main() {
    printf("%lld\n",f(getint()+3)-1);
    return 0;
}

E - 符合条件的整数

题目大意:

[2n,2m)(n,m65)内满足x\equiv1\pmod{7}x个数。

思路:

使用__int128直接算即可。

源代码:

#include<cstdio>
#include<cctype>
#include<iostream>
typedef unsigned __int128 uint128;
std::ostream &operator <<(std::ostream &os,const uint128 &x) {
    if(x>=10) os<<x/10;
    return os<<int(x%10);
}
inline int getint() {
    register char ch;
    while(!isdigit(ch=getchar()));
    register int x=ch^'0';
    while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    return x;
}
int main() {
    const int n=getint(),m=getint();
    std::cout<<(((uint128)1<<m)-2)/7-(((uint128)1<<n)-2)/7<<std::endl;
    return 0;
}

F - 可爱即正义

题目大意:

给你一个字符串s,问是否能通过交换两个字符使得其不包括suqingnianloveskirito作为子串。

思路:

哈希以后统计suqingnianloveskirito的出现次数,并记录出现位置,分情况讨论即可。

源代码:

明明很多锅(比如cnt=0时交换前两个可能产生新的suqingnianloveskirito),但还是过了。

#include<cstdio>
#include<cstring>
using uint64=unsigned long long;
const int N=1e6+2,base=31;
char s[N];
const char t[23]="\0suqingnianloveskirito";
uint64 hash[N],pwr[N],tmp;
int pos[N];
inline uint64 calc(const int &i) {
    return hash[i]-hash[i-21]*pwr[21];
}
int main() {
    scanf("%s",&s[1]);
    const int n=strlen(&s[1]);
    if(n==1) {
        puts("No");
        return 0;
    }
    for(register int i=pwr[0]=1;i<=n;i++) {
        pwr[i]=pwr[i-1]*base;
        hash[i]=hash[i-1]*base+s[i]-'a'+1;
    }
    for(register int i=1;i<=21;i++) {
        tmp=tmp*base+t[i]-'a'+1;
    }
    int cnt=0;
    for(register int i=1;i<=n;i++) {
        if(i>=21&&calc(i)==tmp) {
            pos[++cnt]=i;
        }
    }
    if(cnt==0) {
        puts("Yes\n1 2\n");
        return 0;
    }
    if(cnt==1) {
        puts("Yes");
        printf("%d %d\n",pos[1],pos[1]-1);
        return 0;
    }
    if(cnt==2) {
        puts("Yes");
        printf("%d %d\n",pos[1],pos[2]-1);
        return 0;
    }
    puts("No");
    return 0;
}
posted @   skylee03  阅读(251)  评论(3编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
历史上的今天:
2017-09-12 [SPOJ-LCS]Longest Common Substring
点击右上角即可分享
微信分享提示