FZU 1851 组合数
2024-08-31 06:22:21
给你两个数n和m,然后让你求组合数C(n,m)中的质因子的个数。
这里用到的一个定理:判断阶乘n!中的质因子 i 的个数的方法---f(n!)=n/i+n/i^2+n/i^3+.....n/i^m (i为一个质因子,m是使n/i^m=0的最小值);
又已知C(n,m)=n!/ ( m!·(n-m)! ) ; 所以需要n!中所有的质因子的个数,然后再减去m! 和 (n-m)! 这些质因子的个数,得到的结果就是该组合数质因子的个数。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <set>
#include <utility>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std; const int N=1e6+;
bool book[N];
vector<int> prime;
void get_prime() //筛法预处理素数表
{
fill(book,book+N,false);
for(int i=;i<N;i++)
{
if(!book[i])
{
prime.push_back(i);
for(int j=i+i;j<N;j+=i)
book[j]=true;
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
get_prime();
int n,m;
while(scanf("%d%d",&n,&m)&&n&&m)
{
int res=;
int len=prime.size();
for(int i=;i<len&&prime[i]<=n;i++)
{ //分别计算n!、m!、(n-m)! 中含有质因子prime[i]的个数,再把n!的个数减去m!和(n-m)!的个数
int tn=n,tm=m,tt=n-m,cnt=;
while(tn)
{
cnt+=tn/prime[i];
tn/=prime[i];
}
while(tm)
{
cnt-=tm/prime[i];
tm/=prime[i];
}
while(tt)
{
cnt-=tt/prime[i];
tt/=prime[i];
}
if(cnt) res++;
}
printf("%d\n",res);
}
return ;
}
最新文章
- 百度云推送-服务端 C# SDK
- less,sass,stylus配置和应用教程及三者比较
- jstl c:choose>;、<;c:when>;和<;c:otherwise>;标签
- poj1330
- PLSQL 连接Oracle11g (64位)
- Yii rabc角色权限管理文章推荐
- VS2013 快捷键 VS RESHARPER 设置
- jenkins集群加入Windows 2012 server作为slave
- 织梦系统与discuz论坛整合方法
- poj2828 Buy ticket
- jfinal 源码学习
- ES6小点心之通用弹窗
- Linux学习之XShell与虚拟机的连接
- Win32项目生成的程序exe图标显示异常的问题
- 漫谈hashcode
- IdentityServer4 中文文档 -14- (快速入门)使用 ASP.NET Core Identity
- Get started with Docker for Windows
- Tarjan 强连通分量 及 双联通分量(求割点,割边)
- vue中输入框聚焦,自动跳转下一个输入框
- jformdesigner 开发
热门文章
- JQuery+Bootstrap总结
- 使用ZeppelinHub来存储和展示ZeppelinNoteBook
- 【Codeforces】Codeforces Round #373 (Div. 2) -C
- Eclipse 每次ctrl-c ctrl-v 就变慢?
- (转) OpenLayers3基础教程——OL3 介绍control
- servlet_获取初始化参数
- HDU_1269_tarjan求强连通分量
- NSURLProtectionSpace 证书认证的上下文
- tomcat 热加载设置
- 【转载】java中的反射