TopCoderOpen Algorithm 2014 Round 1C MEDIUM - FizzBuzzTurbo

Source

TopCoderOpen Algorithm 2014 Round 1C MEDIUM (450pt)
Problem Statement

問題概要

ある整数 $k$ を言う時,
$k$ が $3$ の倍数で $5$ の倍数でないならその数を言う代わりに $\verb|Fizz|$ と,
$k$ が $5$ の倍数で $3$ の倍数でないならその数を言う代わりに $\verb|Buzz|$ と,
$k$ が $3$ の倍数かつ $5$ の倍数ならその数を言う代わりに $\verb|FizzBuzz|$ と言う.
$A$ 以上 $B$ 以下の整数を順番に言っていく時,$\verb|Fizz|$,$\verb|Buzz|$,$\verb|FizzBuzz|$ はそれぞれ何回言われるかを求める問題.

解法

$1$ から $B$ までに言われる数から,$1$ から $A-1$ までに言われる数を引けば良い.
$1$ から $X$ までに言われる $\verb|FizzBuzz|$ の数は $\lfloor X/15 \rfloor$ だし,
$\verb|Fizz|$,$\verb|Buzz|$ はそれぞれ $\lfloor X/3 \rfloor$,$\lfloor X/5 \rfloor$ から $\verb|FizzBuzz|$ の数 $\lfloor X/15 \rfloor$ を引けば良い.

C++によるスパゲッティなソースコード

#include<bits/stdc++.h>
using namespace std;

#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

#define ll long long

class FizzBuzzTurbo {
public:
vector<ll> counts(ll A, ll B) {
  int i, j, k;
  vector<ll> res;

  rep(i,3) res.push_back(0LL);

  A--;
  res[2] = (B/15) - (A/15);
  res[1] = (B/5) - (A/5) - res[2];
  res[0] = (B/3) - (A/3) - res[2];

  return res;
}

}

Current time: 2024年03月29日20時32分03秒
Last modified: 2014年04月27日05時24分10秒 (by laycrs)
Tags: Competitive_Programming TopCoder TopCoderOpen TCO_Algorithm TCO_Algorithm_2014 TCO_Algorithm_2014_1C
トップページに戻る

Logged in as: unknown user (not login)

ログイン: