蚂蚁笔试9-15 算法卷 AK代码

第一题
质因数分解 判断奇偶即可
#include <bits/stdc++.h>

using namespace std;

int main(){
    // freopen("1.in","r",stdin);
    int t;
    int n;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int cnt=0;
        for(int i=2;i*i<=n;i++){
            while(n%i==0){
                n/=i;
                cnt++;
            }
        }
        if(n!=1) cnt++;
        if(cnt%2==0) puts("yukari");
        else puts("kou");
    }
    return 0;
}
第二题
找最长数组长度,然后差分一下即可
#include <bits/stdc++.h>

using namespace std;

int a[220000];
int res[220000];
int main(){
    // freopen("1.in","r",stdin);
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    int pre=0;
    a[0]=-100000;
    for(int i=1;i<=n;i++){
        if(a[i]>a[i-1]) pre++;
        else pre=1;
        res[pre]++;
    }
    for(int i=n;i>=1;i--) res[i]+=res[i+1];
    for(int i=1;i<=n;i++){
        printf("%d",res[i]);
        if(i==n) puts("");
        else printf(" ");
    }

    return 0;
}
第三题
遍历字符串,对于i这个位置求取子序列不存在i之后字符且包含i的好子序列个数,然后累加起来即可
对于每个位置好串枚举26个字母
若s[i]=j,则个数是C(num[j],1)+C(num[j],3)+C(num[j],5)+... 二项式定理得Pow(2, num[j]-1)
若s[i]!=j,则个数是C(num[j],0)+C(num[j],2)+C(num[j],4)+... 二项式定理得Pow(2,num[j]-1)
具体代码如下
#include <bits/stdc++.h>

using namespace std;

const int N=2e5+7;
char s[N];
int num[30];
long long TMP[30];
long long mod=1e9+7;
long long Pow(long long x){
    long long res=1;
    long long p=2; 
    while(x){
        if(x%2==1) {
            res=res*p%mod;
            x--;
        }
        else{
            x/=2;
            p=p*p%mod;
        }
    }
    return res;
}
int main(){
    // freopen("1.in","r",stdin);
    scanf("%s",s+1);
    int n=strlen(s+1);
    long long ans=0;
    for(int i=0;i<26;i++) TMP[i]=1;
    for(int i=1;i<=n;i++){
        long long p=1;
        for(int j=0;j<26;j++){
            if(num[j]==0){
                if(s[i]-'a'==j) p=0;
                continue;
            }
            if(s[i]-'a'==j){
                TMP[j]=Pow(num[j]-1);
            }
            p=p*TMP[j]%mod;
        }
        ans = (ans+p)%mod;
        num[s[i]-'a']++;
        TMP[s[i]-'a']=Pow(num[s[i]-'a']-1);
    }
    printf("%lld\n",ans);
    return 0;
}



#蚂蚁笔试##笔试##蚂蚁金服##蚂蚁2023秋招笔试凉了啊#
全部评论

相关推荐

机械打工仔:不管啥专业,找工作改简历的第一课先把你那排版改了,简历上不要写个人简历四个字,找你要简历的谁不知道这个是简历?而且还占那么多空间,直接把自己名字和基础信息写上面,整体字体大一些。 还有这种经典两页简历一页大空白,导出PDF的时候多了一页几乎全是白的你自己看着不难受吗随手的事为啥不能改掉呢,这是态度问题,你试想一下你是HR你打开简历看到格式都没调整过会是什么感受?你自己都不重视你的简历,HR更不会在意。 然后内容你那个做两年咖啡就别往里写了,简历在精不在多,你在往你的简历里打字的时候就要想好这东西对你要找的工作有没有帮助。自我评价写一行就行了,不如给专业技能单开一栏。核心课程均分90这个真别写了,把你上过的有用的专业课列出来也行。有很多地方废话很多的精炼一下,比如你校内项目第一个写的那些,全然没有重点。 好好修改一下,我看你内容也挺优秀的,别被一个随便做的简历耽误了,我一个同专业的打工人看了都揪心更别说一天看几百份简历的HR
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
投递拓竹科技等公司10个岗位
点赞 评论 收藏
分享
评论
7
12
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务