読者です 読者をやめる 読者になる 読者になる

UVa11296 Counting Solutions to an Integral Equation

概要
非負整数 n が与えられる。x. y, z を非負整数として、x+2y+2z = n となるパターン数を求めよ。
ただし n < 1000001 であり、テストケースは最大で 1500 である。

解答
TLEにならないように一重ループ以内で解きたい。

x+Y=n と書き換えると、Y は偶数である必要性が生じる。よって問題文を以下のように解釈し直す。
「n以下の非負整数xがある。n-x が偶数であるとき、 (n-x)/2 を2つに分けるパターン数を求めよ。」
すると以下のように O(n) で解が求まる。

#include <iostream>

using namespace std;

int main() {
  
  int n;
  while(cin >> n) {
    long long ans = 0;
    int ini = n & 1;
    for(int x=ini; x<=n; x+=2) {
      ans += (n-x)/2+1;
    }
    cout << ans << endl;
  }
  
  return 0;
}