我很憤怒
求方程 1/x+1/y=1/(n!) 的正整數解的組數,其中n≤10^6。
解的組數,應模1e9+7。
輸入格式:
輸入乙個整數n
輸出格式:
輸出答案
輸入樣例#1:
輸出樣例#1:
極其噁心的一道題...
看到這種題肯定是需要化簡式子的,因為出題人不會好到給你乙個好做的式子
\[\frac+\frac=\frac
\]\[\frac=\frac
\]\[xy=(n!)\times (x+y)
\]乙個騷操作,兩邊同時加上\((n!)^2\),為什麼,因為方便因式分解...
\[(n!)^2-(n!)\times (x+y)+xy=(n!)^2
\]然後因式分解
\[(n!-x)\times (n!-y)=(n!)^2
\]令\(a=(n!-x),b=(n!-y)\),因為\((n!)^2\)是確定的,所以確定了\(a\),就可以確定\(b\),也就可以確定\(x,y\)了
那麼a的方案數是多少?因為\(a\)是\((n!)^2\)的因子,所以\(a\)的取值的方案數就是\((n!)^2\)的因子的方案數
然後根據唯一分解定理
\[n!=p_1^\times p_2^\times ...\times p_m^
\]\[(n!)^2=p_1^\times p_2^\times ...\times p_m^
\]由於每個質因子\(p_i\)都有\(2\times c_i+1\)種取值,所以
\[ans=(2\times c_1+1)\times (2\times c_2 +1)\times ...\times(2\times c_m+1)
\]那麼最後問題就轉化成了對\(n!\)進行分解質因數,並求質因數的個數
暴力對\(1-n\)每個數分解質因數,再合併複雜度過高,為\(o(n\sqrt n)\)
由於\(n!\)的每個質因子都不超過n,所以我們可以預處理\(1-n\)內所有質數p,再考慮\(n!\)內一共有多少個質因子p
\[\lfloor\frac\rfloor+\lfloor\frac\rfloor+...+\lfloor\frac}}\rfloor
\]對於每個質因子,我們只需要\(log\ n\)的時間來求解,所以總複雜度是\(o(n\ log\ n)\)的
#include#define rg register
#define il inline
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define lol long long
#define in(i) (i=read())
using namespace std;
const lol n=1e6+10,mod=1e9+7;
lol read()
while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0',i=getchar();
return ans*=f;
}lol n,cnt,ans=1;
lol g[n],prime[n],c[n];
void init()
}}int main()
{ in(n); init();
for(int i=1;i<=n;i++)
for(int j=i;j!=1;j/=g[j]) c[g[j]]++;
for(int i=1;i<=n;i++) ans=ans*(c[i]*2+1)%mod;
cout<
洛谷P1445 Violet 櫻花
推式子 frac frac frac 先通分 frac frac 交叉相乘 xy n x y 移項 n x y xy 0 兩邊加上 n 2 n 2 n x y xy n 2 因為方便十字相乘法因式分解 n x n y n 2 令 a n x b n y 因為 n 2 已確定 那只要確定 a 就能確定...
題解 洛谷P1445 Violet 櫻花
題面 我們首先對題目中的式子進行化簡 begin frac frac frac y times n x times n xy x n times y x times n y frac frac frac frac frac n frac end 因為 x 和 y 都是正整數,所以 frac 也一定是...
洛谷 P4167 Violet 櫻花
題面 又懶得弄題面,開個傳送門吧 分析人生第一次切數學題,我們先把方程寫出來 frac frac frac 現在我們知道的條件是x,y都是正整數 廢話 所以我們考慮單獨通過式子的變換將x,y表示出來,表示出來的式子算出來也一定是個整數 frac frac frac frac frac frac fr...