51nod 1189 阶乘分数(分解质因数)
2016-05-17 20:37
288 查看
1189 阶乘分数
题目来源: Spoj基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
收藏 关注
1/N! = 1/X + 1/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
1N!=1X+1Y
XY=N!X+N!Y
两边同时加上N!2
XY−N!X−N!Y+N!2=N!2
(X−N!)(Y−N!)=N!2
之后只要对N!分解质因数即可
把1到N的每个数的质因子都找出来
ans=∑pk|N!num[pk]
AC代码如下:
#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <string> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <sstream> #include <cstdlib> #include <iostream> #include <algorithm> #pragma comment(linker,"/STACK:102400000,102400000") using namespace std; #define MAX 1000005 #define MAXN 1000005 #define maxnode 15 #define sigma_size 30 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define lrt rt<<1 #define rrt rt<<1|1 #define middle int m=(r+l)>>1 #define LL long long #define ull unsigned long long #define mem(x,v) memset(x,v,sizeof(x)) #define lowbit(x) (x&-x) #define pii pair<int,int> #define bits(a) __builtin_popcount(a) #define mk make_pair #define limit 10000 //const int prime = 999983; const int INF = 0x3f3f3f3f; const LL INFF = 0x3f3f; const double pi = acos(-1.0); const double inf = 1e18; const double eps = 1e-8; const LL mod = 1e9+7; const ull mx = 133333331; /*****************************************************/ inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; } /*****************************************************/ bool prime[MAX]; int pr[MAX]; int tot; int vis[MAX]; void init(){ mem(prime,0);tot=0; for(int i=2;i<MAX;i++){ if(!prime[i]) pr[tot++]=i; for(int j=0;j<tot&&pr[j]*i<MAX;j++){ prime[i*pr[j]]=1; if(i%pr[j]==0) break; } } } LL qpow(LL a,LL n){ LL ans=1; while(n){ if(n&1) ans=ans*a%mod; a=a*a%mod; n>>=1; } return ans; } int main(){ //freopen("in.txt","r",stdin); int n; cin>>n; init(); mem(vis,0); for(int i=1;i<=n;i++){ int k=i; for(int j=0;j<tot&&pr[j]*pr[j]<=k;j++){ if(k%pr[j]==0){ while(k%pr[j]==0){ k/=pr[j]; vis[pr[j]]+=2; } } } if(k!=1) vis[k]+=2; } LL ans=1; for(int i=0;i<=1000000;i++){ ans=ans*(vis[i]+1)%mod; } cout<<(ans+1)*qpow(2LL,mod-2)%mod<<endl; return 0; }
相关文章推荐
- centos6.6下openoffice安装过程
- JDK7的Comparison method violates its general contract异常
- Java面向对象之接口
- hdu 3339(最短路+01背包)
- C++课程 second work _1025
- Java第八天听课总结--jar 包的使用(1)
- [置顶] 作品展示
- iOS - 报错 The dependency `xxx` is not used in any concrete target
- 选择排序之--简单选择排序,堆排序
- 计算机视觉测试数据集 dataset
- 在线编程--小范围排序
- Learning Kalman filter
- 转:windows下定时执行备份数据库
- 2016-5-17模拟测试
- 使用Vsftpd服务传输文件。
- mysql安装
- js设置radio选中 【转】
- Struts2--Action详述
- Android 数据存储
- IoT Architecture