PKU : 3090 - Visible Lattice Points
アルゴリズム
全格子点が見えるか見えないかを, 最初に全て列挙してしまう.
(三重ループ or XとYが互いに素な点を探す)
さらに, 答えの値もそのときに求めておく.
あとは, Nが入力されたら出力するだけ.
プログラム
bool flg[1002][1002]; int cnt[1002]; int ans[1002]; int main(void){ memset(flg,true,sizeof(flg)); memset(cnt,0,sizeof(cnt)); flg[0][0] = false; rep(i,1001){ rep(j,1001){ if(!flg[i][j]) continue; cnt[max(i,j)]++; int x = j + j; int y = i + i; while(x <= 1000 && y <= 1000){ flg[y][x] = false; x += j; y += i; } } } REP(i,1,1001){ ans[i] = ans[i-1] + cnt[i]; } int T; scanf("%d",&T); rep(i,T){ int n; scanf("%d",&n); printf("%d %d %d\n",i+1,n,ans[n]); } }