HDU 3304 求杨辉三角第N行中能被素数P整除的数的个数

等价于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;
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值