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. JavaScript原型链与继承

    最近学习了<Javascript高级程序设计>面向对象部分,结合书中的例子总结一下原型链和继承部分的内容. 创建对象 在Js当中没有类这个概念,当我们想要创建具有相同属性的对象的时候,有如 ...

  2. kettle工具二次开发-代码启动JOB

    kettle工具是一款优秀的数据同步.数据处理的BI工具,收到了很多人的青睐.kettle软件通过可视化的图标可以让我们很轻易的能完成数据同步.处理的开发工作.但是使用kettle可视化界面在跑JOB ...

  3. Ubuntu 系统搭建php服务器 用ssh 远程操作

    一:在桌面下载xshell客户端连接 ,vmavar 上的 Ubuntu系统,遇到的问题跟大家分享一下,希望大家少走弯路 Ubuntu系统默认没有ssh server 要安装 apt-get inst ...

  4. VMVare虚拟机的异常处理---内部错误

    由于昨天晚上关闭虚机时手快,直接把机器睡眠了.今天早上开机后,虚机显示启动状态,但是无法连接.搜了一下,网上说删掉.lk锁文件就可以了,删掉后,没有反应,强制关闭,再次启动VM,还是打不开,显示内部错 ...

  5. 使用xib方式创建UITableViewCell,设置Label自动换行注意事项

    自定义的UITableViewCell,使用xib方式创建,想要其中的UILabel换行显示:计算Label的高度,让其自动换行,总是没有效果. 我猜测原因可能在于使用了autolayout布局.只要 ...

  6. OC——NSArray和NSMutableArray

    /*---------------------NSArray---------------------------*/ //创建数组 NSArray *array1 = [NSArray arrayW ...

  7. Method to fix "Naming information cannot be located because the target principal name is incorrect." for AD replication failure

    Assume Failure DC FP01 and Working DC DC01 1. Stop the Key Distribution Center (KDC) service on FP01 ...

  8. C#入门中的必备语法(一)

    首先我们要知道C#语言是一种面向对象的语言由C和C++演变而来,它依赖于.NET Framework..NET Framework可以提供一个强大的代码库供其调用.之所以说C#语言依赖于.NET Fr ...

  9. jdbc select

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  10. hdu2429Ping pong

    Problem Description N(3<=N<=20000) ping pong players live along a west-east street(consider th ...