HDU 3304 求杨辉三角第N行中能被素数P整除的数的个数
来源:互联网 发布:笔试算法题 编辑:程序博客网 时间:2024/05/16 18:45
等价于C(n,m)%p==0求m的个数
n!/(m!*(n-m)!)%p==0
N!中p的因子个数等于m!与(n-m)!中的p的因子和
即f(n) ==f(m)+f(n-m) //f(n)表示n!所含有的因子数
F(n)=n/p+n/(p^2)+....
即:
n/p+n/p^2+...=m/p+m/p^2+..+(n-m)/p+(n-m)/p^2+... (1)
又因为n/p^i>=m/p^i+(n-m)/p^i,
所以等价于对任意i都有n/p^i =m/p^i+(n-m)/p^i (2)
N=n/p^i*p^i+n%p^i(注意这里所有的除法都是整除)
(2)两边都乘以p^i
n-n%p^i=m-m%p^i+n-m+(n-m)%p^i
n%p^i-m%p^i=(n-m)%p^i>=0
又等价于 m%(p^i)<=n%(p^i) (3)对任意正整数i都成立。(//从2到3这个一步相当的重要,是本题的一个关键点)
将n和m分别写成P进制数 n0,n1,n2,n3,n4,.... m0,m1,m2,m3,m4,....
根据(3)可以由数学归纳法得到,对于任意位上的ni都大于等于mi
当i=0;显然成立
假设i=k成立,当i=k+1时
因为m%(p^k)<=n%(p^k)
n(k+1)nk..n1=n(k+1)(nk%(p^k))(表示按p进制摆放)
所以要保证n%(p^(k+1))>=m%(p^(k+1))
必须保证最高位即n(k+1)>=m(k+1)
即(3)成立的充要条件就是 m0<=n0, m1<=n1 ....
所以m的可取值个数就是(n0+1)*(n1+1)*(n2+1)......
//HDU 3304
#include<iostream>
using namespace std;
int main()
{
int n,p,ans,cs;
cs=0;
while(cin>>p>>n)
{
cs++;
if ( (n==0)&&(p==0) ) break;
ans=1;
while(n!=0)
{
ans=ans*(n%p+1)%10000;
n=n/p;
}
cout<<"Case "<<cs<<": ";
if (ans<1000) cout<<'0';
if (ans<100) cout<<'0';
if (ans<10) cout<<'0';
cout<<ans<<endl;
}
}
- HDU 3304 求杨辉三角第N行中能被素数P整除的数的个数
- 求杨辉三角第n行的第n数
- hdu 1124 (n! 中素数p的个数的应用)
- 求杨辉三角第n行的第m个数算法的深入研究
- (java)统计小于N的数中素数的个数
- hdu 4546 输入n个数 问这n个数相加组成的第K小的数是什么
- 求杨辉三角的第n行
- 1到n范围内能被5或6或8整除的数的个数
- HDU 1796 How many integers can you find(求1到n-1之间能被一个集合A内元素整除的数的个数)
- 素数回文数的个数
- 孪生素数(找出数n范围内相差1或2的素数的个数)
- hdu 3652 数位dp(能被13整除且包含13的数的个数)
- 1012 求小于n的数里,与n互为素数的个数
- 查找N个数中第K大的数
- 查找N个数中第K大的数
- 求第n个数的斐波那数
- ACM程序设计书中题目--U(寻找第n个能被3或5整除的数)
- 反素数 模板 求因子的个数为n的最小的数是什么
- 函数生成的ALV的按钮列表
- Socket Programming下IPv6的支持
- function模式的ALV如何响应单击事件
- Flash Player 10.1内部机制(第二部分) - 执行模型之可变跑道
- 顶级程序员的心得 Coders at Work (II)
- HDU 3304 求杨辉三角第N行中能被素数P整除的数的个数
- c++中初始化和赋值的区别
- function模式设置ALV用弹出窗口显示
- python 工具
- alv 可编辑列为数量,但更改数量后变成小数了
- 鼠标光标的位置,
- IIS 相关知识补充
- pku 2513 Colored Sticks
- 当你学不进去的时候,不妨看看大脑是怎么想的?