ごとに考えるのではなく、集計する考え方をするのがポイント!!!
問題概要
正の整数 が与えられる。各 に対して、
- は正の整数
を満たすような の組の個数を求めよ。
制約
考えたこと
最初に特定の整数 に対して
- は正の整数
を満たす の個数を求めることを考えてみる。まず、
より、 となることがわかる。同様に , も成立している。よって、
をすべて試せば OK。この場合の計算量は となる。
では、 のすべてについて求めるにはどうしたらよいだろうか?一見するとまともに上記のことをやると かかりそうな気がしてくる。
しかしよく考えると、
をすべて試すときに、 として
counter[v]++;
という感じにすれば OK。こうすることで、 に対する個数をまとめて求めることができる。よって全体の計算量は でできる。
#include <bits/stdc++.h> using namespace std; int main() { int N; cin >> N; vector<long long> num(N+1, 0); for (long long x = 1; x <= 100; ++x) { for (long long y = 1; y <= 100; ++y) { for (long long z = 1; z <= 100; ++z) { long long n = x*x + y*y + z*z + y*z + z*x + x*y; if (n <= N) num[n]++; } } } for (int n = 1; n <= N; ++n) cout << num[n] << endl; }