Codeforces Round #520 (Div. 2) 題解
阿新 • • 發佈:2018-11-23
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; }