阶乘分数

1/N! = 1/X + 1/Y (0<x<=y),给出N,求满足条件的整数解的数量。例如:N = 2,1/2 = 1/3 + 1/6,1/2 = 1/4 + 1/4。由于数量可能很大,输出Mod 10^9 + 7。
Input
输入一个数N(1 <= N <= 1000000)。
Output
输出解的数量Mod 10^9 + 7。
Input示例
2
Output示例
2
#include <iostream>  
#include <cstring>  
#include <cstdio>  
#include <algorithm>  
using namespace std;  
      
const int MAXN = 1e6 + 10;  
const int MOD = 1e9 + 7;  
typedef long long ll;  
      
int prime[MAXN], cnt;  
bool vis[MAXN];  
      
void init() 
{  
    cnt = 0;  
    memset(vis, 0, sizeof(vis));  
    for (int i = 2; i < MAXN; i++) 
	{  
        if (!vis[i]) 
		{  
            prime[cnt++] = i;  
            for (int j = i + i; j < MAXN; j += i)
			{
                vis[j] = 1;  
			}
        }  
    }  
}  
      
ll calu(int n, int p) 
{  
    if (n < p)
	{
		return 0;  
	}

	return calu(n / p, p) + n / p;  
}  
      
ll quick_mod(ll a, ll b)
{  
    ll result = 1;  
    while (b) 
	{  
        if (b & 1) 
		{
			result = result * a % MOD;  
		}
        b >>= 1;  
        a = (a * a) % MOD;  
    }  

    return result;  
}  
      
int main() 
{  
    init();  
    int n;  
    
	cin >> n;
    ll result = 1;  
    ll m = quick_mod(2LL, (ll)MOD - 2);  
    for (int i = 0; i < cnt && prime[i] <= n; i++) 
	{  
        ll tmp = (calu(n, prime[i]) * 2 + 1) % MOD;  
        result = result * tmp % MOD;  
    }  
    result = result * m % MOD;  
    result = (result + m % MOD) % MOD;  
	cout << result << endl;
	
    return 0;  
}  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值