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で数を大きくならないようにしたほうがいいです。多分。