51nod 1189 阶乘分数(数论)

简介: 51nod 1189 阶乘分数(数论)

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。

输入

输入一个数N(1 <= N <= 1000000)。

输出

输出解的数量Mod 10^9 + 7。

输入样例

2

输出样例

2


1/N! = 1/X + 1/Y

=> 1/N! = (X+Y)/XY

=> XY = N!(X+Y)

=> (X-N!)(Y-N!) = (N!)^2

A*B = (N!)^2

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2000005;
typedef long long ll;
const int mod = 1e9 + 7;
int prime[maxn];
int isprime[maxn];
int cnt = 0;
ll base = 500000004;
void getPrime(int n) {
  isprime[1] = 1;
  for (int i = 2; i <= n; i++) {
    if (!isprime[i]) {
      prime[++cnt] = i;
    }
    for (int j = 1; j <= cnt && i * prime[j] <= n; j++) {
      isprime[i * prime[j]] = 1;
      if (i % prime[j] == 0) {
        break;
      }
    }
  }
}
ll getCount(int x, int n) {
  ll ans = 0;
  while (n) {
    ans += n / x;
    n /= x;
  }
  return ans;
}
int main() {
  int n;
  cin >> n;
  getPrime(n);
  ll ans = 1;
  for (int i = 1; i <= cnt; i++) {
    ll x = getCount(prime[i], n) * 2% mod;
    ans = ans * (x + 1)% mod;
  }
  cout << (ans + 1) * base % mod<< endl;
  return 0;
}
相关文章
|
10月前
|
算法
初阶OI素数算法——埃拉托尼斯筛
时间复杂度比较优秀且易于理解的素数筛选法
56 0
|
3月前
|
C++
【PTA】​ L1-080 乘法口诀数列​(C++)
【PTA】​ L1-080 乘法口诀数列​(C++)
73 0
【PTA】​ L1-080 乘法口诀数列​(C++)
51nod 1711 平均数(二分 + 树状数组好题)
51nod 1711 平均数(二分 + 树状数组好题)
88 0
PTA 7-4 素数等差数列 (20 分)
2004 年,陶哲轩(Terence Tao)和本·格林(Ben Green)证明了:对于任意大的 n,均存在 n 项全由素数组成的等差数列。
93 0
|
Java
HDOJ/HDU 1250 Hat's Fibonacci(大数~斐波拉契)
HDOJ/HDU 1250 Hat's Fibonacci(大数~斐波拉契)
93 0
|
算法 大数据
51Nod 1080 两个数的平方和(数论,经典题)
1080 两个数的平方和                 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题                 给出一个整数N,将N表示为2个整数i j的平方和(i
896 0
|
算法
51Nod 1003 阶乘后面0的数量(数学,思维题)
1003 阶乘后面0的数量                 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题             n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0。
1256 0