D.パワープロダクツ(マップメモリ因数分解ベクトル+)

タイトル

質問の意味:

    所定数N、出力点の数は、任意の番号(i <j)の[I] * [J] = k番目のパワーを満たします。
     2 n個 1 0 5 2 K 100 1 A 1 0 5 ^ 52≤n≤10、2≤k≤100,1≤a_i≤10^ 5

分析:

    各数値は、その後、明らかに彼らの素因数にも条件を満足する条件を満たすように2つの数値を乗じ、素因数に分解されます。素数の因数分解我々はそう、ベクター配列、品質係数と格納されたインデックスに対応する配列の各要素、モジュロ・インデックスkの応答を形成し、その整合配列は、対応するインデックスK-指標です。このベクトルを格納マップには、ログインすることができます(n)を見つけるために。

#include <iostream>
#include <vector>
#include <map>
using namespace std;

typedef long long ll;

vector<pair<int,int> > temp;
map<vector<pair<int,int> >,int> ma;

void divide(int n,int k)
{
	int a = n;
	for (int i = 2; i * i <= n; i++)
	{
		if( a % i == 0 )
		{
			int num = 0;
			while( a % i == 0 )
			{
				a /= i;
				num ++;
			}
			num %= k;
			if( num != 0 ) temp.push_back(make_pair(i,num)); 
		}
	}
	if( a > 1 ) temp.push_back(make_pair(a,1)); 
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,k;
	cin >> n >> k;
	ll ans = 0;
	for (int i = 1; i <= n; i++)
	{
		int x;
		cin >> x;
		temp.clear();
		divide(x,k);
		vector<pair<int,int> > aim;
		for (int i = 0; i < temp.size(); i++)
		{
			aim.push_back(make_pair(temp[i].first,k-temp[i].second)); 
		}
		ans += ma[aim];
		ma[temp]++;
	} 
	cout << ans << '\n';
	return 0;
}

公開された132元の記事 ウォンの賞賛6 ビュー7913

おすすめ

転載: blog.csdn.net/weixin_44316314/article/details/105076281