POJ2992:Divisors(求N!因子的个数,乘性函数,分解n!的质因子(算是找规律))
题目链接: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!的质因子(算是找规律))的更多相关文章
- php实现求最小的k个数(日常出错很容易是分号或者$符号忘记写了)
php实现求最小的k个数(日常出错很容易是分号或者$符号忘记写了) 一.总结 日常出错很容易是分号或者$符号忘记写了 二.php实现求最小的k个数 题目描述 输入n个整数,找出其中最小的K个数.例如输 ...
- hdu 6069 Counting Divisors(求因子的个数)
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- LightOj 1278 - Sum of Consecutive Integers(求奇因子的个数)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1278 题意:给你一个数n(n<=10^14),然后问n能用几个连续的数表示; 例 ...
- NYOJ-476谁是英雄,分解质因子求约数个数!
谁是英雄 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 十个数学家(编号0-9)乘气球飞行在太平洋上空.当横越赤道时,他们决定庆祝一下这一壮举.于是他们开了一瓶香槟.不 ...
- [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)
题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0(n) be the number of positive diviso ...
- 快速求n的质因子(数论)
快速求n的质因子 如何尽快地求出n的质因子呢?我们这里又涉及两个好的算法了! 第一个:用于每次只能求出一个数的质因子,适用于题目中给的n的个数不是很多,但是n又特别大的 #include<std ...
- HDU1452:Happy 2004(求因子和+分解质因子+逆元)上一题的简单版
题目链接:传送门 题目要求:求S(2004^x)%29. 题目解析:因子和函数为乘性函数,所以首先质因子分解s(2004^x)=s(2^2*x)*s(3^x)*s(167^x); 因为2与29,166 ...
- Soldier and Number Game---cf546D(打表求n的素因子个数)
题目链接:http://codeforces.com/problemset/problem/546/D 题意: 给出一个n,n开始是a!/b!,每次用一个x去整除n得到新的n,最后当n变成1的时候经过 ...
- 牛客小白月赛5-D-阶乘(求n内每个数的阶乘相乘后尾数为0的个数)
题目描述 输入描述: 输入数据共一行,一个正整数n,意义如“问题描述”. 输出描述: 输出一行描述答案:一个正整数k,表示S的末尾有k个0 输入例子: 10 输出例子: 7 --> 示例1 输入 ...
随机推荐
- [转]五分钟看懂UML类图与类的关系详解
在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分为 ...
- 【转自IT虾米网:www.itxm.net】外部应用和drools-wb6.1集成解决方案
一.手把手教你集成外部应用和drools workbench6.1 1. 首先按照官方文档安装workbench ,我用的是最完整版的jbpm6-console的平台系统,里面既包含j ...
- css两列等高布局
布局方案 等高布局有几种不同的方法,但目前为止我认为浏览器兼容最好最简便的应该是padding补偿法.首先把列的padding-bottom设为一个足够大的值,再把列的margin-bottom设一个 ...
- VMware 12安装虚拟机Mac OS X 10.10(VMware12安装/共享文件夹)
推荐电脑配置 1:Inter I5及以上 (A卡请自行百度大神解决方案) 必须开启CPU虚拟化:开机进入BIOS--->Intel Virtualization Technology---> ...
- Android中SurfaceView用法示例
SurfaceView在游戏开发中有着举足轻重的地位,它对于画面的控制有着更大的自由度(不像View要用handler来更新,关于View的),但这方面的参考资料并不是太多,能找到的例子都有点喧宾夺主 ...
- C文件流
在Linux系统中,系统默认认为每个进程打开了3个文件,即每个进程默认可以操作3 个流,即标准输入了流(/dev/stdin),标准输出流(/dev/stdout),标准错误输出流(/dev/stde ...
- m2014-architecture-imgserver->利用Squid反向代理搭建CDN缓存服务器加快Web访问速度
案例:Web服务器:域名www.abc.com IP:192.168.21.129 电信单线路接入访问用户:电信宽带用户.移动宽带用户出现问题:电信用户打开www.abc.com正常,移动用户打开ww ...
- 使用C#语言实现一些功能
今天由于是周六,所以就没讲课啦,于是我就仔细看啦几道还没掌握的题,然后总结啦一下. 一.三级联动 像这个三级联动吧,感觉在做网站时间肯定会用到啦,但是那时间肯定不会是这样子做的啦,不可能把所有的省市区 ...
- List转换为数组Array的方法
List<String> list = new ArrayList<String>(); list.add("str1"); list.add(" ...
- 程序启动-Runloop
0 从程序启动开始到view显示: start->(加载framework,动态静态链接库,启动图片,Info.plist,pch等)->main函数->UIApplicationM ...