Codeforces Round #520 (Div. 2) 题解

A. A Prank

题目:

传送门

此题要考虑两种特殊情况,一种是第一个数为1,另一个是最后一个数为1000.

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=105;
int a[maxn];
int n;
int Max=0;
int main()
{
    scanf("%d",&n);
    for (int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for (int i=0;i<n;i++)
    {
        for (int j=i+1;j<n;j++)
        {
            if(a[j]-a[i]==j-i)
            {
                int t=j-i-1;
                if(j==n-1&&a[j]==1000)
                {
                    t++;
                }
                if(i==0&&a[i]==1)
                {
                    t++;
                }
                Max=max(Max,t);
            }
        }
    }
    printf("%d\n",Max);
    return 0;
}

B. Math:

题目:
传送门1

这道题被成功的带歪了。一开始想着模拟,结果死活写不对。

快结束的时候终于想出咋做来了。

先分解素因子,将最大的素因子指数和最小的素因子指数记下来,因为可以乘任何数,所以只需要乘一次即可,剩下的都是开平方根,然后取大于等于它的2的指数,如果最大值和最小值不相等或者最大值小于2的指数的话则知乎还要加一,输出指数。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
typedef long long ll;
const ll maxn=1e6+5;
ll n;
int is[maxn];
vector<int>v;
void is_su ()
{
    memset (is,0,sizeof(is));
    for (int i=2;i<=maxn-5;i++)
    {
        if(!is[i])
        {
            v.push_back(i);
            for (int j=2*i;j<=maxn-5;j+=i)
            {
                is[j]=1;
            }
        }
    }
}
ll a[30];
int main()
{
    a[0]=1;
    for (int i=1;i<=20;i++)
    {
        a[i]=a[i-1]*2;
    }
    is_su();
    scanf("%lld",&n);
        int num=0;
       ll ans=1;
       ll temp=n;
    int Max=0;
    int Min=0x3f3f3f3f;
    int Size=v.size();
    int flag1=0;
    for (int i=0;i<Size&&temp>=v[i];i++)
    {
        int t=0;
        int flag=0;
        while (temp%v[i]==0)
        {
            flag=1;
            temp/=v[i];
            t++;
        }
        if(flag)
        {
            ans*=v[i];
        Max=max(t,Max);
        Min=min(t,Min);
        }
    }
    int loc;
    for (int i=0;;i++)
    {
        if(a[i]>=Max)
        {
            loc=i;
            break;
        }
        num++;
    }
     if((Max<a[loc]||Max!=Min)&&loc!=0)
          num++;
     printf("%lld %d\n",ans,num);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/84098158