# Prime Number# Modular Arithmetic# Number Theory

d472 - 算術基本原理

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算算術基本原理所表示的 N mod 76543。輸入為 k 序列,其中 k_i 為第 i 個質數的指數。輸出為 N mod 76543。

解題思路

程式碼首先使用埃拉托斯特尼篩法找出 10000 以內的質數。然後,程式讀取輸入的 k 序列,對於序列中的每個質數,計算質數的 n 次方,並將結果累乘,最後取模 76543。模運算使用快速冪演算法來提高效率。

複雜度分析

  • 時間複雜度: O(N log log N + L log N),其中 N 是質數篩選的上限 (10000),L 是輸入序列的長度。埃拉托斯特尼篩法的時間複雜度為 O(N log log N),快速冪的時間複雜度為 O(log N),因此總時間複雜度為 O(N log log N + L log N)。
  • 空間複雜度: O(N),主要用於儲存質數陣列。

程式碼

#include <iostream>
using namespace std;
long long int p[10001]={1,1},it,pri[2001],bm;
long long int mod(long long int b,long long int p,long long int m){
	if(p==0)return 1;
	if(p==1)return bm;
	bool o=p&1;
	p>>=1;
	long long int tmp=mod(b,p,m);
	if(o)
		return tmp*tmp*b%m;
	else
		return tmp*tmp%m;
}
int main(){
	long long int ans=1,n;
	for(int i=2;i<=100;++i)
		for(int j=i+i;j<=10000;j+=i)
			p[j]=1;
	for(int i=0;i<=10000;++i)
		if(p[i]==0)
			pri[it++]=i;
	it=0;
	while(cin >> n){ 
		bm=pri[it]%76543;
		ans*=mod(pri[it++],n,76543);
		ans%=76543;
	}
	cout << ans;
}

Discussion