洛谷P1445 [Violet]櫻花

bcrQAQ發表於2019-02-11

題意

給定一個整數n\text{n},求方程1x+1y=1n!\dfrac{1}{x}+\dfrac{1}{y}=\dfrac{1}{n!} 的正整數解的組數。
其中1n1061 \leq n \leq 10^6


思路

原方程左邊通分x+yxy=1n!\dfrac{x+y}{xy}=\dfrac{1}{n!}

交叉相乘,得(x+y)n!=xy(x+y)n!=xy

(x+y)n!+xy=0-(x+y)n!+xy=0

等式兩邊同時加上(n!)2(n!)^2,得(n!)2(x+y)n!+xy=(n!)2(n!)^2-(x+y)n!+xy=(n!)^2

因式分解(xn!)(yn!)=(n!)2(x-n!)(y-n!)=(n!)^2

a=xn!a=x-n!b=yn!b=y-n!,則ab=(n!)2ab=(n!)^2

唯一分解定理n!=i=1kpicin!=\prod\limits_{i=1}^kp_i^{c_i}

(n!)2=i=1kpi2ci(n!)^2=\prod\limits_{i=1}^kp_i^{2c_i}

ab=i=1kpi2ciab=\prod\limits_{i=1}^kp_i^{2c_i}

n!∵n!是確定的

確定了a,ba,b,就能確定x,yx,y

而且只要確定了aa,就能確定bb

a∵a(n!)2(n!)^2的因式

a∴ai=1k(2ci+1)\prod\limits_{i=1}^k(2c_i+1)種取值

那麼答案就是i=1k(2ci+1)\prod\limits_{i=1}^k(2c_i+1) modmod (109+7)(10^9+7)

(以上推導過程轉載自大佬M_sea的題解,如果M_sea大佬不同意我的行為,請告訴我,我將很快刪除這一段)


程式碼

const
	nn=1000000;
	mo=1000000007;
var
	a,s,v:array[0..nn+10] of longint;
	i,j,cnt,n,t:longint;
	ans:int64; //安全起見,防止爆炸
begin
	read(n);
	fillchar(s,sizeof(s),0);
	cnt:=0;
	fillchar(v,sizeof(v),0);
	for i:=2 to n do
	begin
		if v[i]=0 then
		begin
			inc(cnt);
			a[cnt]:=i;
			v[i]:=i;
		end;
 		for j:=1 to cnt do
		begin
			t:=a[j];
			if (t>v[i]) or (t*i>n) then break;
			v[t*i]:=a[j];
		end; 
	end; //線性篩法求素數
	for i:=2 to n do 對n!進行質因數分解
	begin
		t:=i;
		while t<>1 do
		begin
			inc(s[v[t]]);
			t:=t div v[t]; //因為v[t]必然是t的因子
		end;
	end;
	ans:=1;
	for i:=1 to cnt do 
		ans:=ans*(s[a[i]] shl 1+1) mod mo; //計算答案
	writeln(ans);
end.

時間複雜度為O(nlogn)\mathcal{O(nlogn)}