雄牛の頭をなでる-----------------------------------------数論(任命のための逆の考え方番号)

今日はベッシーの誕生日です。彼女の誕生日を祝うために、ベッシーはあなたをゲームに招待します。

BessieはN頭の牛(1からNまでの番号が付けられた)を円に座らせました。

1番とN番の牛を除いて、i番の牛はi-1とi + 1番の牛に隣接し、N番の牛は1番の牛に隣接しています。

農夫のジョンはバケツに多くの紙片を入れました。それぞれの紙片には1から1000000までの数字が入っています。

次に、各牛iがバケツから1枚の紙を取り出します。紙の番号はAiで示されます。

すべての牛が選択された後、各牛は円を描くように回転します。牛の場合、自分の手にある数を牛の手にある数で割ることができれば、牛の頭が叩かれます。

牛はあなたが彼らが各牛のために打たれる必要がある牛の数を決定するのを助けることを望みます。

つまり、N個の整数A1、A2、...、ANがあります。Aiの数ごとに、他の数のうちその約数がいくつあるかを調べます。

入力形式
最初の行には整数Nが含まれています。

次のN行、各行には整数Aiが含まれます。

出力フォーマットは
N行で、i行目の数字はi番目の牛が叩く必要のある牛の数です。

データ範囲
1≤N≤105、
1≤Ai≤106の
入力サンプル:
5
2
1
2
3
4。
出力サンプル:
2
0
2
1
3。
分解能:
前処理[1,1000000]の数の各数倍

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+1000;
int cnt[N];
int res[N];
int a[N];
int n,x;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
    	scanf("%d",&a[i]);
    	cnt[a[i]]++;
	}
	for(int i=1;i<=N;i++)
	{
		for(int j=i;j<=N;j+=i)
		{
			res[j]+=cnt[i];
		}
	 }
	 for(int i=1;i<=n;i++) cout<<res[a[i]]-1<<endl;
}
公開された元の記事572件 賞賛された14件 ビュー10,000件以上

おすすめ

転載: blog.csdn.net/qq_43690454/article/details/105418513