n<=10^6

m<=10^6

p=2^32

用unsigned int 可以避免取模

我写的SB超时 阶乘分解代码

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
using namespace std;
const unsigned int N=1000000+5;
unsigned int tag[N],p[N],z[N],mm[N];
unsigned int cnt = 0;
unsigned int n,m;
unsigned int quickpow(unsigned int m,unsigned int n)
{
unsigned int b = 1;
while (n > 0)
{
if (n & 1)
b = (b*m);
n = n >> 1 ;
m = (m*m);
}
return b;
} void get_prime()
{
tag[1]=1;
tag[0]=1;
for (unsigned int i = 2; i < N; i++)
{
if (!tag[i]) p[cnt++] = i;
for (unsigned int j = 0; j < cnt && p[j] * i < N; j++)
{
tag[i*p[j]] = 1;
if (i % p[j] == 0)
break;
}
}
}
unsigned int FIND(unsigned int x)
{
unsigned int l=0,r=cnt-1;
while(l<=r)
{
unsigned int m=(l+r)/2;
if(p[m]==x) return m;
else if(p[m]<x) l=m+1;
else r=m-1;
}
}
void fenjie(unsigned int *a,unsigned int d)
{
for(unsigned int i=0;i<cnt&&p[i]<=sqrt(d);i++)
{
while(d%p[i]==0)
{
d=d/p[i];
a[i]++;
}
}
if(tag[d]==0)
{
unsigned int t=FIND(d);
a[t]++;
}
}
int main()
{
// freopen("a.in","r",stdin);
get_prime();
int T;
cin>>T;
while(T--)
{
cin>>n>>m;
memset(z,0,sizeof(z));
memset(mm,0,sizeof(mm));
for(unsigned int i=n;i>=n-m+1;i--)
fenjie(z,i);
for(unsigned int i=1;i<=m;i++)
fenjie(mm,i);
unsigned int ans=1;
for(unsigned int i=0;i<cnt;i++)
{
z[i]=z[i]-mm[i];
ans=ans*quickpow(p[i],z[i]);
}
printf("%u\n",ans);
}
}

利用阶乘的质因数分解!

比如250!

1*2*3*4*5*6*7*8*9*10*11*12*13*14.....250

中3的质因子个数 除了3后变成(不是倍数的不管)计算3^1次方的为250/3个

又变成 1 2 3 .....250除3  

重复上面 知道 3^2 为250/(3^2) 

所以阶乘的质因数分解是另外的简单算法

void getcn(int n)
{
int ans = 0;
int i;
for (i = 1; i <= prime[0] && prime[i] <= n; i++)
{
int tmp = n;
while (tmp)
{
num[i] += tmp / prime[i];
tmp /= prime[i];
}
}
num[0] = i;
}

所以最后的代码是

#include <string.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string>
#include <algorithm>
#include <vector>
#include <string.h>
#include <time.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <sstream>
#define INF 0x3f3f3f3f
#define MAXN 1000005
#define Precision 100005
#define MAX_INT 2147483647
#define Pi acos(-1.0)
#define lowbit(x) ((x)&(-x))
#define Lson root<<1,left,mid
#define Rson root<<1|1,mid+1,right
#define LL long long
#define ULL unsigned long long
#define fresh(x) memset(x,0,sizeof(x))
using namespace std; int prime[MAXN];
int num[MAXN]; void print()
{
<span style="white-space:pre"> </span>memset(prime, 0, sizeof(prime));
<span style="white-space:pre"> </span>for (int i = 2; i <= 1000000; i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>if (!prime[i]) prime[++prime[0]] = i;
<span style="white-space:pre"> </span>for (int j = 1; j <= prime[0] && prime[j] <= 1000000 / i; j++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>prime[prime[j]*i] = 1;
<span style="white-space:pre"> </span>if (i % prime[j] == 0) break;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
} unsigned qpow(unsigned a, unsigned b)
{
<span style="white-space:pre"> </span>unsigned ans = 1;
<span style="white-space:pre"> </span>while (b)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>if (b & 1)
<span style="white-space:pre"> </span>ans *= a;
<span style="white-space:pre"> </span>b >>= 1;
<span style="white-space:pre"> </span>a *= a;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return ans;
} void getcn(int n)
{
<span style="white-space:pre"> </span>int ans = 0;
<span style="white-space:pre"> </span>int i;
<span style="white-space:pre"> </span>for (i = 1; i <= prime[0] && prime[i] <= n; i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>int tmp = n;
<span style="white-space:pre"> </span>while (tmp)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>num[i] += tmp / prime[i];
<span style="white-space:pre"> </span>tmp /= prime[i];
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>num[0] = i;
} void getcm(int m)
{
<span style="white-space:pre"> </span>int ans = 0;
<span style="white-space:pre"> </span>int i;
<span style="white-space:pre"> </span>for (i = 1; i <= prime[0] && prime[i] <= m; i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>int tmp = m;
<span style="white-space:pre"> </span>while (tmp)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>num[i] -= tmp / prime[i];
<span style="white-space:pre"> </span>tmp /= prime[i];
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
} int main()
{
<span style="white-space:pre"> </span>int n, m, T;
<span style="white-space:pre"> </span>print();
<span style="white-space:pre"> </span>//printf("%d\n", prime[prime[0]]);
<span style="white-space:pre"> </span>//cout << prime[0];
<span style="white-space:pre"> </span>scanf("%d", &T);
<span style="white-space:pre"> </span>while (T--)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>memset(num, 0, sizeof(num));
<span style="white-space:pre"> </span>scanf("%d%d", &n, &m);
<span style="white-space:pre"> </span>getcn(n);
<span style="white-space:pre"> </span>getcm(m);
<span style="white-space:pre"> </span>getcm(n - m);
<span style="white-space:pre"> </span>unsigned ans = 1;
<span style="white-space:pre"> </span>for (int i = 1; i <= num[0]; i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>ans *= qpow(prime[i], num[i]);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>printf("%u\n", ans);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return 0;
}

【(阶乘的质因数分解)算组合数】【TOJ4111】【Binomial efficient】的更多相关文章

  1. P2043 质因子分解(阶乘的质因数分解)

    P2043 质因子分解 对$n!$进行质因数分解的一种高效算法 首先,筛出$<=n$的素数 蓝后,对$n$反复除以$prime$,同时$cnt+=n/prime$ $n!$中含有该$prime$ ...

  2. 济南学习D3T1__线性筛和阶乘质因数分解

    [问题描述] 从1− N中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少. [输入格式] 第一行一个数字N. [输出格式] 一行,一个整数代表答案对100000007取模之后的 ...

  3. 对于n!的快速质因数分解

    N!的阶乘的质因数分解 对于N的阶乘 比如8! 我们要算其中一个质因数出现次数 我们注意到 8!=1 2 3 4 5 6 7 8 1 1 1 1 2的倍数出现的次数8/2=4 1 1 4的倍数出现的次 ...

  4. 【BZOJ2227】【ZJOI2011】看电影 [组合数][质因数分解]

    看电影 Time Limit: 10 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 到了难得的假期,小白班上组织大家去看 ...

  5. poj 3421 X-factor Chains——质因数分解

    题目:http://poj.org/problem?id=3421 记忆化搜索竟然水过去了.仔细一想时间可能有点不对,但还是水过去了. #include<iostream> #includ ...

  6. Poj 1401 Factorial(计算N!尾数0的个数——质因数分解)

    一.Description The most important part of a GSM network is so called Base Transceiver Station (BTS). ...

  7. POj3421 X-factor Chains(质因数分解+排列组合)

    POj3421X-factor Chains 一开始没读懂题意,不太明白 Xi | Xi+1 where a | b means a perfectly divides into b的意思,后来才发现 ...

  8. HDU3988-Harry Potter and the Hide Story(数论-质因数分解)

    Harry Potter and the Hide Story Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 ...

  9. UVA10375 Choose and divide 质因数分解

    质因数分解: Choose and divide Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %l ...

随机推荐

  1. Unity 调用android插件

    1. Unity的Bundle Identifier必须和你的android报名一致 Activity和View的区别: Activity应该是一个展示页面,View是页面上一些按钮视图等等. 如何调 ...

  2. IOS 下雪动画修改版本

    #define SNOW_IMAGENAME @"snow" #define IMAGE_X arc4random()%(int)Main_Screen_Width #define ...

  3. Java核心技术,让计算机"一芯多用"的多线程技术

    我们在使用计算的时候会感受到计算机好像在同时执行很多任务,这也是我最初接触计算机给我留下的印象,而我们普通人在同一时刻大脑只能思考一件事情(当然不排除一些异能者能够做到一心二用),而且我们在思考完一件 ...

  4. java学习笔记day04

    1.static关键字  特点:1)随着类的加载而加载        2)优先于对象存在        3)被所有对象所共享        4)可以直接被类名调用(类名.静态成员) 注意:静态方法只能 ...

  5. Head First C#(赛狗日)

    实验背景: 人:Joe.Bob和AI希望参见赛狗赌博.最初,Joe有50元,Bob有75元,AI有45元.每次比赛前,他们都会各自决定是否下注以及所押的赌金.直到比赛前,他们都可以改变赌金,但是一旦比 ...

  6. python 笔记1--基础类型

    list 操作 append() 添加最外面 insert(pos,content) 插入指定地方 pop() 删除最外面 pop(pos) 删除指定地方 list中可以有list,且能用二维数组的方 ...

  7. SyntaxError: Non-ASCII character '\xe2' in file 编码错误

    Editing .py file in the Notepad: But when run in the PowerShell, I found the follwing error: It seem ...

  8. 出发 Let's Go

    今天是中秋佳节,而恰好我这天过生日,晚上睡觉前又恰好听到温岚唱的祝我生日快乐,心里挺高兴的. 最近,由于公司需要,可能要学习Python和Tribon了,全是未知的,一点不了解的东西,也忽然想起了在这 ...

  9. http://www.sufeinet.com/thread-655-1-1.html

    http://www.sufeinet.com/thread-655-1-1.html

  10. USACO 1.4 ariprog 解题报告

    这是继虫洞之后又让我为难的一个 剪枝题目,无论如何,做的再快,也只能过6个点,最后三个点也TLE.后来参考了一下标答,大概思路是这样的. 朴素算法就不多说了,枚举a,b然后判断就行,网上说这样优化到位 ...