题目链接:http://poj.org/problem?id=2992

题目要求:Your task in this problem is to determine the number of divisors of Cnk. Just for fun -- or do you need any special reason for such a useful computation?

题目解析:这题也是TLE了无数遍,首先说一下求因子数目的函数是积性函数,积性函数即f(n)=f(a)*f(b),a与b互质并且a*b==n,因为n很大,所以要利用积性函数的性质,将n分解质因数,然后求其质因数的因子和,之后相乘即可,公式如下:

定理:设正整数n的所有素因子分解n=p1^a1*p2^a2*p3^a3****Ps^as,那么

T(n)=(a1+1)*(a2+1)*(a3+1)***(an+1);(求因子的个数的公式)

这题是求Cnk. 直接求肯定超时,所以要找规律,我没有找到,看了大神的题解,求N!质因子的规律如下,

首先,我们可以把所有的N以内的质数给打表求出来

然后,求每一个质因子的指数个数,这里用到了一个公式,:

ei=[N/pi^1]+ [N/pi^2]+ …… + [N/pi^n]  其中[]为取整

附:这一步最近又想到了一个更好的方法  int ei=0;while(N)  ei+=(N/=pi);   怎么样??

(想一想为什么,实在想不通你就举个例子试一下)

最后,就是套公式计算了,M=(e1+1)*(e2+1)*……*(en+1)

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define N 500
using namespace std;
typedef long long ll;
bool b[N];
int n,k,i,num[N],prime[N],top;
__int64 sum;
int main()
{
top=;
b[]=b[]=false;
b[]=true;
for(i=; i<; i++)
if(i%==) b[i]=false;
else b[i]=true;
double t=sqrt(*1.0);
for(i=; i<=t; i++)
{
if(b[i])
{
for(int j=i*i; j<; j=j+i)
b[j]=false;
}
}
for(i=;i<=;i++)
{
if(b[i])
{
prime[top++]=i;
}
}
while(scanf("%d%d",&n,&k)!=EOF)
{
sum=;
memset(num,,sizeof(num));
int X=,t,z;
for(i=prime[];i<=n;i=prime[++X])
{
t=n;
z=i;
while(t/z)//核心部分
{
num[i]+=t/z;
z*=i;
}
}
X=;
for(i=prime[];i<=n-k;i=prime[++X])
{
t=n-k;
z=i;
while(t/z)
{
num[i]-=t/z;
z*=i;
}
}
X=;
for(i=prime[];i<=k;i=prime[++X])
{
t=k;
z=i;
while(t/z)
{
num[i]-=t/z;
z*=i;
}
}
for(int i=; i<=n; i++)
{
if(num[i])
{
sum*=(num[i]+);
}
}
printf("%I64d\n",sum);
}
return ;
}

暴力到死的代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define N 500
using namespace std;
typedef long long ll; int n,k,i;
int num[N];
ll sum;
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
sum=;
memset(num,,sizeof(num));
if(k>n/)
k=n-k;
for(int z=n-k+;z<=n;z++)
{
i=z;
for(int j=;j*j<=i;j++)
{
if(i%j==)
{
num[j]++;
i/=j;
while(i%j==)
{
num[j]++;
i/=j;
}
}
}
if(i!=)
num[i]++;
}
for(int z=;z<=k;z++)
{
i=z;
for(int j=;j*j<=i;j++)
{
if(i%j==)
{
num[j]--;
i/=j;
while(i%j==)
{
num[j]--;
i/=j;
}
}
}
if(i!=)
num[i]--;
}
for(int i=;i<=n;i++)
{
if(num[i])
{
num[i]++;
//printf("___%d %d\n",i,num[i]);
} }
for(int i=;i<=n;i++)
{
if(num[i])
{
sum*=num[i];
}
}
printf("%lld\n",sum);
}
return ;
}

POJ2992:Divisors(求N!因子的个数,乘性函数,分解n!的质因子(算是找规律))的更多相关文章

  1. php实现求最小的k个数(日常出错很容易是分号或者$符号忘记写了)

    php实现求最小的k个数(日常出错很容易是分号或者$符号忘记写了) 一.总结 日常出错很容易是分号或者$符号忘记写了 二.php实现求最小的k个数 题目描述 输入n个整数,找出其中最小的K个数.例如输 ...

  2. hdu 6069 Counting Divisors(求因子的个数)

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  3. LightOj 1278 - Sum of Consecutive Integers(求奇因子的个数)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1278 题意:给你一个数n(n<=10^14),然后问n能用几个连续的数表示; 例 ...

  4. NYOJ-476谁是英雄,分解质因子求约数个数!

    谁是英雄 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 十个数学家(编号0-9)乘气球飞行在太平洋上空.当横越赤道时,他们决定庆祝一下这一壮举.于是他们开了一瓶香槟.不 ...

  5. [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)

    题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0​(n) be the number of positive diviso ...

  6. 快速求n的质因子(数论)

    快速求n的质因子 如何尽快地求出n的质因子呢?我们这里又涉及两个好的算法了! 第一个:用于每次只能求出一个数的质因子,适用于题目中给的n的个数不是很多,但是n又特别大的 #include<std ...

  7. HDU1452:Happy 2004(求因子和+分解质因子+逆元)上一题的简单版

    题目链接:传送门 题目要求:求S(2004^x)%29. 题目解析:因子和函数为乘性函数,所以首先质因子分解s(2004^x)=s(2^2*x)*s(3^x)*s(167^x); 因为2与29,166 ...

  8. Soldier and Number Game---cf546D(打表求n的素因子个数)

    题目链接:http://codeforces.com/problemset/problem/546/D 题意: 给出一个n,n开始是a!/b!,每次用一个x去整除n得到新的n,最后当n变成1的时候经过 ...

  9. 牛客小白月赛5-D-阶乘(求n内每个数的阶乘相乘后尾数为0的个数)

    题目描述 输入描述: 输入数据共一行,一个正整数n,意义如“问题描述”. 输出描述: 输出一行描述答案:一个正整数k,表示S的末尾有k个0 输入例子: 10 输出例子: 7 --> 示例1 输入 ...

随机推荐

  1. Entity FrameWork实现增、删、改、分页的数据层代码实现

    public bool AddEntity(Customer entity)//添加实体   {       MyHotelModelContainer hotelDB = new MyHotelMo ...

  2. iis部署网站,使用虚拟路劲

    此前一直使用vs2010,没有考虑过配置IIS,但是一个项目完成后交付给甲方使用.肯定是要考虑IIS的安装和部署的.现从IIS的安装和asp.NET项目的部署两个方面讲解. IIS安装: 网上很多教程 ...

  3. day24<多线程>

    多线程(多线程的引入) 多线程(多线程并行和并发的区别) 多线程(Java程序运行原理和JVM的启动是多线程的吗) 多线程(多线程程序实现的方式1) 多线程(多线程程序实现的方式2) 多线程(实现Ru ...

  4. Android Tab切换

    ViewPager+FragmentStatePagerAdapter 页面切换案例详解 http://blog.csdn.net/u010203181/article/details/4462963 ...

  5. Linux基本监控项目

    1.网卡流量 (统计网卡TX(发送)RX(接受)流量脚本) 使用 Nagios 来监控网卡流量 2013/01/31 Nagios, 网卡 监控统计与日志分析 评论 2,272   下载地址为:che ...

  6. /etc/docker/key.json

    /etc/docker/key.json 描述信息: This is the dockerd key for TLS connections.in web format, that docker us ...

  7. 如何在Oculus官网下载OculusSetup.exe(当前时间20170720)

    踩着免费的蓝灯FQ登录了Oculus官网,找了半天找不到哪里下载OculusSetup.exe,最后在最下面的支持中心找到了..... https://www.oculus.com/

  8. 格式化输出%s和%S的区别

    使用s时,printf是针对单字节字符的字符串,而wprintf是针对宽字符的 使用S时,正好相反,printf针对宽字符 CString中的format与printf类似,在unicode字符集的工 ...

  9. Windows下重置Mysql密码

    1.首先停止正在运行的MySQL进程 >net stop mysql 如未加载为服务,可直接在进程管理器或者服务中进行关闭. 2.以安全模式启动MySQL进入mysql目录在命令行下运行 > ...

  10. cocos2d-x游戏引擎核心之六——绘图原理和绘图技巧

    一.OpenGL基础 游戏引擎是对底层绘图接口的包装,Cocos2d-x 也一样,它是对不同平台下 OpenGL 的包装.OpenGL 全称为 Open Graphics Library,是一个开放的 ...