結果

問題 No.1659 Product of Divisors
ユーザー snrnsidysnrnsidy
提出日時 2021-10-22 22:34:29
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 9 ms / 2,000 ms
コード長 1,495 bytes
コンパイル時間 2,143 ms
コンパイル使用メモリ 212,540 KB
実行使用メモリ 4,844 KB
最終ジャッジ日時 2023-10-24 13:55:04
合計ジャッジ時間 3,299 ms
ジャッジサーバーID
(参考情報)
judge14 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 8 ms
4,844 KB
testcase_01 AC 8 ms
4,844 KB
testcase_02 AC 7 ms
4,844 KB
testcase_03 AC 8 ms
4,844 KB
testcase_04 AC 8 ms
4,844 KB
testcase_05 AC 8 ms
4,844 KB
testcase_06 AC 8 ms
4,844 KB
testcase_07 AC 7 ms
4,844 KB
testcase_08 AC 7 ms
4,844 KB
testcase_09 AC 8 ms
4,844 KB
testcase_10 AC 9 ms
4,844 KB
testcase_11 AC 7 ms
4,844 KB
testcase_12 AC 8 ms
4,844 KB
testcase_13 AC 7 ms
4,844 KB
testcase_14 AC 8 ms
4,844 KB
testcase_15 AC 8 ms
4,844 KB
testcase_16 AC 8 ms
4,844 KB
testcase_17 AC 8 ms
4,844 KB
testcase_18 AC 8 ms
4,844 KB
testcase_19 AC 8 ms
4,844 KB
testcase_20 AC 8 ms
4,844 KB
testcase_21 AC 8 ms
4,844 KB
testcase_22 AC 9 ms
4,844 KB
testcase_23 AC 8 ms
4,844 KB
testcase_24 AC 8 ms
4,844 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
 
using namespace std;
 
vector <int> prime;
map <int,int> cnt;
const long long int MOD = 1e9 + 7;

long long int mypow(long long int x,long long int n)
{
	long long int res = 1;
	while(n>0)
	{
		if(n%2==1)
		{
			res = ((res%MOD)*(x%MOD)%MOD);
			res%=MOD;
		}
		x = ((x%MOD)*(x%MOD)%MOD);
		x%=MOD;
		n/=2;
	}
	return res;
}
 
void eratos(void)
{
	bool isprime[1000001];
	memset(isprime,true,sizeof(isprime));
	for(int i=2;i<=1000000;i++)
	{
		if(isprime[i])
		{
			prime.push_back(i);
			for(int j=2*i;j<=1000000;j+=i)
			{
				isprime[j] = false;
			}
		}
	}
}
 
int main(void)
{
	cin.tie(0);
	ios::sync_with_stdio(false);
 
	long long int N,M;
 
	cin >> N >> M;
 
	eratos();

	for(int i=0;i<prime.size();i++)
	{
		if(N==1 || N < prime[i]*prime[i])
		{
			break;
		}
		if(N%prime[i]==0)
		{
			int count = 0;
			while(1)
			{
				if(N%prime[i]!=0)
				{
					break;
				}
				count++;
				N/=prime[i];
			}
			cnt[prime[i]] = count;
		}
	}
 
	if(N!=1)
	{
		cnt[N] = 1;
	}
 
	long long int res = 1;
 
	for(auto it : cnt)
	{
		long long int y = it.second;
		long long int x = M;
		long long int A = x + y;
		long long int B = y;
		long long int val = 1;
		for(int i=0;i<B;i++)
		{
			long long int X = (A-i)%MOD;
			if(X < 0) X += MOD;
			val = ((val%MOD)*(X%MOD)%MOD);
			val%=MOD;
		}
		for(int i=B;i>=1;i--)
		{
			val = ((val%MOD)*(mypow(i,MOD-2)%MOD)%MOD);
			val%=MOD;
		}
		res = ((res%MOD)*(val%MOD)%MOD);
		res%=MOD;
	}
 
	cout << res << '\n';
 
	return 0;	
}
0