51nod 1189 阶乘分数(阶乘素因子分解)
来源:互联网 发布:域名在哪里购买 编辑:程序博客网 时间:2024/05/17 07:52
题目链接:传送门
分析:
1/n! = 1/x +1/y
==> n! * (x + y) = x * y
==> n!^2 = (x - n!)*(y - n!)
==> a = b * c ,a = n!^2 ,b = x - n! ,c = y - n!
因此题目就转化成求a的约数的问题了,然后对a进行素
因子分解就可以了,统计的时候记得去重。
代码如下:
#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; else return calu(n/p,p) + n/p;}LL quick_mod(LL a,LL b){ LL ans = 1; while(b){ if(b&1) ans=ans*a%mod; b>>=1; a=a*a%mod; } return ans ;}int main() { init(); int n; while(~scanf("%d",&n)) { LL ans = 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; ans=ans*tmp%mod; } ans = ans*m%mod; ans = (ans+1*m%mod)%mod; printf("%lld\n",ans); } return 0;}
0 0
- 51nod 1189 阶乘分数(阶乘素因子分解)
- 51 NOD 1189 阶乘分数(素因子分解+推公式+求逆元)
- 51nod 1189 阶乘分数 (质因子分解,因子个数)
- 阶乘的素因子分解 51nod 1189
- 51nod 1189 阶乘分数(分解质因数)
- 51nod 1189 阶乘分数 (分解质因子加上逆元,乘法逆元基本意思)
- 51nod 1189 阶乘分数 [因子个数+逆元]【数论】
- 【51 nod 1189】【素数+整数唯一分解定理】阶乘分数
- 51nod-阶乘分数-阶乘数质因数分解/组合计数
- 51 nod 1189 阶乘分数
- 51nod 1189 阶乘分数
- 【51Nod 1189】阶乘分数
- 51Nod-1189-阶乘分数
- 51nod 1189 阶乘分数
- 51nod 1189 阶乘分数
- 51Nod 1189 阶乘分数 (数论)
- [数论] 51Nod 1189 阶乘分数
- [51Nod 1189阶乘分数]数学
- ClearCase中lost+found目录介绍
- Android getWindow().setFlags(。。。。。。)
- git commit –a时使用vim编辑提交信息
- 大文件,5亿整数,怎么排?
- 【转】ACM之Java输入输出
- 51nod 1189 阶乘分数(阶乘素因子分解)
- Ibatis
- C语言指针总结
- 计算最大公因数
- Android WebView不能显示图片问题
- 黑马day05 jsp语法相关知识
- 赫夫曼编码实现
- POJ3186:Treats for the Cows
- Uva - 712 - S-Trees