AOJ - Problem 1105 : Unable Count
[1,n]のうちa*i+b*jで表せない数が何個あるか数える問題です。入力a,b,nは10^6以下の整数でi,jは非負整数です。
動的計画法で解ける問題でした。dp[x] := 整数xをa*i+b*jで表すことができるかどうか(0 or 1)で計算しました。dp[0]を1で初期化し、iを0からnまでループしてdp[i]が1だったときはdp[i+a]とdp[i+b]を1にするようにしていきました。
#include <iostream> using namespace std; int main(){ int n,a,b; while( cin >> n >> a >> b , n || a || b ){ int dp[1000001] = {0}; dp[0] = 1; for(int i=0 ; i <= n ; i++ ){ if( dp[i] == 1 ){ if( i+a <= n ){ dp[i+a] = 1; } if( i+b <= n ){ dp[i+b] = 1; } } } int ans = 0; for(int i=1 ; i <= n ; i++ ){ if( dp[i] == 0 ){ ans++; } } cout << ans << endl; } }