1. 程式人生 > 實用技巧 >櫻花--acwing(求n!的約數個數&階乘的質因分解&求約數公式)

櫻花--acwing(求n!的約數個數&階乘的質因分解&求約數公式)

題目:https://www.acwing.com/activity/content/11/可能需要報名課程才能做。
給定一個整數 nn,求有多少正整數數對 (x,y)(x,y) 滿足 1/x+1/y=1/n!。
輸入格式:
一個整數 n。
輸出格式:
一個整數,表示滿足條件的數對數量。
答案對 109+7取模。
資料範圍
1≤n≤106
題意:將這個公式化簡最後可以化簡為:y=n!+(n!)平方/(x-n!)
題解:求階乘的質數分解,然後(c12+1)×(c22+1)—就是答案
求某個數的約數個數公式:

推理公式過程:

程式碼:

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+9;
const int mod=1e9+7;
int n;
int vis[N];
int prime[N];
int cnt;
void init(int n)  //線性篩模板
{
    cnt=0;
    vis[0]=vis[1]=1;
    for(int i=2; i<=n; i++)
    {
        if(vis[i]==0)prime[cnt++]=i;
        for(int j=0; prime[j]*i<=n; j++)
        {
            vis[i*prime[j]]=1;
            if(i%prime[j]==0)break;
        }
    }
}
int main()
{

    scanf("%d",&n);
    init(n);
    ll sum=1;
    for(int i=0; i<cnt; i++)  //階乘質因分解模板
    {
        int ant=0;
        int p=prime[i];
        for(int j=1; pow(p,j)<=n; j++) //找到每個質數可以在n範圍內構成的數的個數
        {                   //因為某個數可能有同一個質數的次方構成,所以列舉次方
            ant+=n/pow(p,j);//找到在n範圍內,可以構成的數的個數
        }
        sum=sum*(ant*2+1)%mod;//利用合數個數公式求答案,這裡就算ant為也沒事兒
    }                       //因為有個+1相當於×本身
    printf("%lld\n",sum);
    return 0;
}