第一题
题目说的很[哔——],然而不顶什么用
说是用最少的二进制数(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;
}
}
}
}