Codeforces Round #520 (Div. 2) 题解

A. A Prank

题目:

传送门

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

代码如下:

#include 
#include 
#include 
#include 
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

B. Math:

题目:
传送门1

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

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

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

代码如下:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
const ll maxn=1e6+5;
ll n;
int is[maxn];
vectorv;
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=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

 

你可能感兴趣的:(codeforces)