首页 > 其他 > 详细

51nod1189 阶乘分数

时间:2019-10-13 09:27:10      阅读:82      评论:0      收藏:0      [点我收藏+]

 

[传送门]

 

推推式子
$$ \dfrac {1}{N!} = \dfrac{1}{X} + \dfrac{1}{Y} $$
$$ \dfrac {1}{X} = \dfrac{1}{N!} - \dfrac{1}{Y} $$
$$ \dfrac {1}{X} = \dfrac{Y - N!}{YN!} $$
$$ YN! = X(Y - N!) $$
$$ XN! = Y(X - N!) $$
$$ \therefore XY(N!)^2 = XY(N! - X)(N! - Y)$$
$$ \therefore (N!)^2 = (N!-X)(N! - Y) $$
把$N! - X$看成一个整体,那么题目就变成了求$(N!)^2$的约数个数了
因为要满足$X \leq Y$,那么答案就是约数个数除以2上取整

技术分享图片
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e6 + 7;
const int MOD = 1e9 + 7;
int prime[N], prin;
bool vis[N];

void getprime() {
    for (int i = 2; i < N; ++i) {
        if (!vis[i]) prime[++prin] = i;
        for (int j = 1; j <= prin && i * prime[j] < N; j++) {
            vis[i * prime[j]] = 1;
            if (i % prime[j] == 0) break;
        }
    }
}

int get(int n, int x) {
    int res = 0;
    int temp = x;
    while (n >= temp) {
        (res += n / temp) %= MOD;
        temp *= x;
    }
    return 2 * res % MOD;
}

signed main() {
    int n;
    scanf("%lld", &n);
    getprime();
    int ans = 1;
    for (int i = 1; i <= prin && n >= prime[i]; i++) {
        int temp = get(n, prime[i]);
        //cout << i << ‘:‘ << temp << ‘\n‘;
        ans = ans * (temp + 1) % MOD;
    }
    printf("%lld\n", (ans + 1) * 500000004 % MOD);
    return 0;
}
View Code

 

51nod1189 阶乘分数

原文:https://www.cnblogs.com/Mrzdtz220/p/11664617.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!