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;
}