Bzoj 2721 [Violet 5]樱花 [数论]

2721: [Violet 5]樱花

Time Limit: 5 Sec   Memory Limit: 128 MB
Submit: 648   Solved: 380

Description

Input

Output

Sample Input

Sample Output

HINT

Source

interviewstreet--EQUATIONS

[ Submit][ Status][ Discuss]


这道题要用到唯一分解定理和约数个数定理
因为
1 / x  +  1 / y  =  1 / n!
所以 1 / x < 1 / n!  且 1 / y < 1 / n!  =>  x > n! 且 y > n!
设 y = n! + d
原式可推得
x = (n!) ^ 2 / d  + n!
即要求 (n!)的约数个数
唯一分解一个数x = p1 ^ a1 * p2 ^ a2 * p3 ^ a3 ..... pk ^ ak
他的约数个数为  num = (a1 + 1) * (a2 + 1) * (a3 + 1).......(ak +1)裸乘法原理.....

/**************************************************************
    Problem: 2721
    User:
    Language: C++
    Result: Accepted
    Time:72 ms
    Memory:6172 kb
****************************************************************/
 
#include 
using namespace std;
 
const int N = 1e6 + 137, mod = 1e9 + 7;
 
int pri[N], tot;
bool isp[N];
 
void Linear_Shaker( int n )
{
    for(int i = 2; i <= n; ++i)
    {
        if(!isp[i]) pri[++tot] = i;
        for(int j = 1; j <= tot && pri[j] * i <= n; ++j)
        {
            isp[pri[j] * i] = 1;
            if(i % pri[j] == 0) break;
        }
    }
}
 
int n;
 
int main()
{
    cin >> n;
    Linear_Shaker(n);
    int ans = 1;
    for(int i = 1; i <= tot; ++i)
    {
        int tmp = n, cnt = 0;
        while(tmp)
            cnt += tmp / pri[i], tmp /= pri[i];
        cnt = (cnt << 1 | 1);
        ans = 1LL * ans * cnt % mod;
    }
    cout << ans << endl;
    return 0;
}


你可能感兴趣的:(数论)