AtCoder Beginner Contest 052/AtCoder Regular Contest 067

はい。
https://beta.atcoder.jp/contests/abc052

A - Two Rectangles

C++14

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int a,b,c,d;
    scanf("%d %d %d %d",&a,&b,&c,&d);
    printf("%d\n",max(a*b,c*d));
 
    return 0;
}

縦かける横で面積の大きい方を出力する。。

B - Increment Decrement

C++14

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int n,ans=0,tmp=0;
    char s[110];
    scanf("%d",&n);
    scanf("%s",s);
    for (int i=0;i<n;i++) {
        tmp+=s[i]=='I'?1:-1;
        ans=max(ans,tmp);
    }
    printf("%d\n",ans);
    return 0;
}

シミュして解答。

C - Factors of Factorial

C++14

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int n,mod=1000000007;
    long long ans=1;
    bool p[1100];
    int  l[1100];
    for (int i=0;i<1100;i++) {
        p[i]=0;
        l[i]=0;
    }
    p[2]=1;
    for (int i=3;i<1100;i++) {
        int f=1;
        int t=2;
        while (t*t<=i) {
            if (i%t==0){
                f=0;
                break;
            }
            t++;
        }
        p[i]=f;
     }
 
     scanf("%d",&n);
     for (int i=2;i<=n;i++) {
        int tmp=i;
        int cnt=0;
        for (int j=2;j<=n;j++) {
            if (p[j]==1) {
                for (;;) {
                    if (tmp%j==0) {
                        l[j]++;
                        tmp/=j;
                    } else {
                        break;
                    }
                }
            }
        }
    }
 
    for (int i=0;i<1100;i++) {
        ans*=l[i]+1;
        ans%=mod;
    }
    printf("%lld\n",ans);
    return 0;
}

Nまでの素数を用意します。Nまでを素因数分解?して2,3,5..の出現回数をカウントします。それぞれの出現回数+1の積が解になります。多分。例えば36は22と32で構成されて、0乗から2乗まで組合せで1と36含んで約数の個数を特定できます。なので出現回数+1の積が解になります。こまめにmodで数を大きくならないようにしたほうがいいです。多分。