11.25 QLU校赛(2)

https://qluacm.club/contest.php?cid=1008

A 约数个数

题意:给出m分解的形式,求m的因数有多少能被g整除
解法(来自wx爸爸,我爱她):暴力求m再%g会TLE。
不妨看分解的形式。如样例m=32 * 52,g=3。
那么所有可以整除g的数中,必然存在至少一个3(如不存在,输出0结束)
于是对于样例,所求因数中存在的3有两种情况:1个或2个。
5有三种:0,1,2。
2*3=6

代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int n,g,b=0;
    long long m=1;
    int p[11],a[11];
    scanf("%d %d",&n,&g);
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&p[i]);
        if(p[i]==g) b=1; 	//判断是否存在g
    }
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&a[i]);
        if(p[i]==g) m=m*a[i];
        else m=m*(a[i]+1);
    }
    if(b==1) printf("%lld",m);
    else printf("0");
    printf("\n");
    return 0;
}

F 折纸达人

全部变成F
题意:折纸,四种折法(合并一下成为两种),剪法亦然
解法:剪一剪就知道了,怀念我昨晚的一桌子纸片
1⃣️如果只存在左右(上下)折的情况,并且左右(上下)剪,最后只会得到两堆废纸
2⃣️如果左右/上下均存在,左右/上下假装无事发生,2(上下/左右)剪的次数+1
怎么得出来的?剪一剪就知道了

代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
string a;
string c;
const long long d=1000000007;
long long ksm(long long a,long long b)
{
    long long i,ans=1;
    for(i=1;i<=b;i++)
    {
        while(b!=0)
        {
            if(b%2!=0) ans=((ans%d)*(a%d))%d;
            a=((a%d)*(a%d))%d;
            b=b/2;
        }
    }
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;++i)
    {
        long long sum1=0,sum2=0;
        int n;
        scanf("%d",&n);
        cin>>a;
        cin>>c;
        for(int j=0;j<n;++j)
        {
            if(a[j]=='B'||a[j]=='T') ++sum1;
            if(a[j]=='R'||a[j]=='L') ++sum2;
        }
        if((c[1]=='L'||c[1]=='R')&&sum1>0) printf("%lld\n",ksm(2,sum1)+1);
        else if((c[1]=='B'||c[1]=='T')&&sum2>0) printf("%lld\n",ksm(2,sum2)+1);
        else printf("2\n");		//这里做了一个异向是否折过的判断,其实并不需要
    }
    return 0;
}

H 神奇老虎机

……不想说话
只需要结尾特判

代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int t,n,a[1001];
    scanf("%d",&t);
    for(int j=1;j<=t;++j)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
        {
            scanf("%d",&a[i]);
            if(i==n) printf("1\n");
            else
            {
                if(a[i]>=1&&a[i]<10) printf("1 ");
                else if(a[i]>=10&&a[i]<100) printf("10 ");
                else printf("100 ");
            }
        }
    }
    return 0;
}

L 寄蒜几何

终于在补题通道关闭前AK了?
思路:尺取法,量取三分之一sum,如果连续的两端长度都和它相等,则Yes
如果sum不是三的倍数,直接No
我的问题:
·没有判断每一部分是否与c(sum/3)相等
·过于繁杂

代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int n,x[1000001];
    int sum=0;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&x[i]);
        sum=sum+x[i];
    }
    if(sum%3!=0) printf("No\n");
    //printf("%d\n",sum);
    else
    {
        int sum1=0;
        bool b=0;
        int i,j;
        for(i=1;i<=n;++i)
        {
            int q=0;
            for(j=i;j<=n;++j)
            {
                //printf("%d\n",x[j]);
                sum1=sum1+x[j];
                //printf("%d\n",sum1);
                if(sum1==sum/3)
                {
                    sum1=0;
                    ++q;
                }
                if(q==2)
                {
                    b=1;
                    break;
                }
            }
            if(b==1) break;
        }
        if(b==1) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值