[7.10] 纪中C组

时间:2022-09-28 09:48:47

第一题
题目说的很[哔——],然而不顶什么用
说是用最少的二进制数(0,1,10之类的整数)覆盖完整数,然而想一想就可以知道,若采用最优策略,那么最少只需要整数中某一位最大的数的次数就行啦

#include <iostream>
#include <cstdio>
using namespace std;
int k,n,i,j,m;
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    scanf("%d",&k);
    for (i=1;i<=k;i++)
    {
        m=0;
        scanf("%d",&n);
        for (j=1;j<=7;j++)
        {
            m=max(m,n%10);
            n/=10;
        }
        printf("%d\n",m);
    }
}

第二题
KC会先给定一个数字Q,每次操作玩家必须写出当前数字的一个因数来代替当前数字,但是这个因数不能是1和它本身。现在规定第一个没有数字可以写出的玩家为胜者。
简单来说就是谁搞到质数谁就赢了
然后分类讨论
1、给的数字就是质数的时候
2、给的数字只有质因数的时候
3、正常情况
然后我们第一步就是码头文件码一波分解因数,每得到一个因数,就把q除到不能再除为止
然后就是自然分类讨论啦
这[哔——]应该不用我说了吧

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
long long x,q,k,i;
int main()
{
    freopen("num.in","r",stdin);
    freopen("num.out","w",stdout);
    scanf("%lld",&q);
    k=q;
    for (i=2;i<=trunc(sqrt(q));i++)
    while (q%i==0)
    {
        x++;
        q/=i;
    }
    if ((float)trunc(sqrt(q))==(float)sqrt(q))
    x++;
    q=k;
    if (x==0)
    {
        printf("1\n0");
        return 0;
    }
    else
    if (x==1)
    {
        printf("2");
        return 0;
    }
    else
    {
        x=1;
        for (i=2;i<=trunc(sqrt((float)q));i++)
        while (q%i==0)
        {
            q/=i;
            x*=i;
            if (x!=i)
            {
                printf("1\n%lld",x);
                return 0;
            }
        }
    }
}