A – 753
A - 753
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
問題文通りに実装すればOKです。
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
int main(){
int X;
cin>>X;
if(X==3||X==5||X==7) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
B – 754
B - 754
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
Sの長さが小さいので、部分文字列全てに対して753との差を取ればOKです。
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
int main(){
string S;
cin>>S;
int ans=INT_MAX;
for(int i=0;i<S.size()-2;i++){
int n=(S[i]-'0')*100+(S[i+1]-'0')*10+(S[i+2]-'0');
ans=min(ans,abs(n-753));
}
cout<<ans<<endl;
}
S[i]-'0'
とやると、文字を数字に変換することができます。
文字は内部的には数字で、’0′,’1′,’2’…は連番になっているため、’0’を引くことで’0’からの相対位置=その文字の数字が拾えます。
C – 755
C - 755
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
“7”,”5″,”3″で数字を作ることを考えた場合、使う数字が三種類しかないため、
1桁のパターン → 3パターン 2桁のパターン → 3^2=9パターン .... N桁のパターン → 3^Nパターン
で、Nが最大9なので最大29523パターンしかありません。
全パターン作り、3,5,7が1個ずつありN以下であるものを抽出しても十分間に合いそうです。
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
set<long long> s;
void make(long long n,int k,int c1,int c2,int c3){
if(c1>0&&c2>0&&c3>0) s.insert(n);
if(k!=0){
make(n*10+3,k-1,c1+1,c2,c3);
make(n*10+5,k-1,c1,c2+1,c3);
make(n*10+7,k-1,c1,c2,c3+1);
}
}
int main(){
int N;
cin>>N;
make(0,9,0,0,0);
int c=0;
auto it=s.begin();
while(it!=s.end()){
if(*it<=N) {
//cout<<*it<<endl;
c++;
}
it++;
}
cout<<c<<endl;
}
完全におまけですが、1月ごろに桁DPの練習として解いていました。
当時のマクロのままですが載せておきます。
※禁断のマクロ、#define int long longがありますが、気にしないで下さい><
#include<iostream>
#include<map>
#include<algorithm>
#include<vector>
#include<stack>
#include<climits>
#include<cmath>
using namespace std;
#define int long long
#define MOD (1000000007)
#define MINF (-1*(LLONG_MAX-10))
#define INF (LLONG_MAX-10)
int ketadp(int N){
int dp[10][2][2][2][2]={{{{{0}}}}};
int q=0;
int tmpn=N;
while(tmpn!=0){
q++;
tmpn/=10;
}
dp[0][0][0][0][0]=1;
for(int i=0;i<q;i++){
int n=N/(int)pow(10,q-i-1)%10;
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
for(int l=0;l<2;l++){
for(int m=0;m<2;m++){
int t=0;
int s=0;
if(i==0) s=1;
if(m==0) t=n;
else t=9;
for(int w=s;w<=t;w++){
//cout<<i<<","<<j<<","<<k<<","<<l<<","<<m<<","<<w<<","<<dp[i][j][k][l][m]<<endl;
int tm=0;
if(w!=t||m==1) tm=1;
if(w==3){
dp[i+1][1][k][l][tm]+=dp[i][j][k][l][m];
}
else if(w==5){
dp[i+1][j][1][l][tm]+=dp[i][j][k][l][m];
}
else if(w==7){
dp[i+1][j][k][1][tm]+=dp[i][j][k][l][m];
}
}
}
}
}
}
}
return dp[q][1][1][1][0]+dp[q][1][1][1][1];
}
signed main(){
int N;
cin>>N;
int q=0;
int tmpn=N;
while(tmpn!=0){
q++;
tmpn/=10;
}
int qq=0;
int ans=0;
for(int i=0;i<q-1;i++){
qq*=10;
qq+=9;
ans+=ketadp(qq);
}
ans+=ketadp(N);
cout<<ans<<endl;
}
D – 756
D - 756
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
2*2*3=12の場合、約数が1,2,3,4,6,12の6個あります。
これは、素因数分解した後のそれぞれの素数の個数から計算できます。
12=2*2*3なら 2を0,1,2個使う → 3通り 3を0,1個使う → 2通り 3*2=6通り
なので、約数が75個というのは以下の4パターンの時です。
ある素因数A,B,Cの個数に着目して Aが74個ある → 75通り Aが14個、Bが4個ある → 15*5=75通り Aが24個、Bが2個ある → 25*3=75通り Aが4個、Bが4個、Cが2個ある → 5*5*3=75通り
N!を素因数分解、それぞれの素数の個数をカウントし、上記4通りのいずれか作れる3つの組み合わせをカウントすればOKです。
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
set<long long> s;
int main(){
int N;
cin>>N;
int c[100]={0};
for(int i=2;i<=N;i++){
int n=i;
for(int j=2;j<=i;j++){
while(n%j==0){
c[j]++;
n/=j;
}
}
}
int ans=0;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
for(int k=j+1;k<N;k++){
if(i!=j&&j!=k&&i!=k){
if(c[i]>=2&&c[j]>=4&&c[k]>=4) ans++;
}
}
}
}
for(int j=0;j<N;j++){
for(int k=0;k<N;k++){
if(j!=k){
if(c[j]>=14&&c[k]>=4) ans++;
if(c[j]>=24&&c[k]>=2) ans++;
}
}
}
for(int k=0;k<N;k++){
if(c[k]>=74) ans++;
}
cout<<ans<<endl;
}
コメント