现在的位置: 首页 > 综合 > 正文

hdu3944(Lucas定理+预处理) hdu3944(Lucas定理+预处理)

2017年11月04日 ⁄ 综合 ⁄ 共 1617字 ⁄ 字号 评论关闭

hdu3944(Lucas定理+预处理)

分类: 数论 66人阅读 评论(0) 收藏 举报

题目:DP?

 

对于本题,由于访问的次数很大,所以当然得先预处理保存在数组中,然后用的时候就不用一次一次的再重复计算了,本题重在预处理。

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #define N 10005  
  4.   
  5. int p;  
  6.   
  7. int prim[N];  
  8.   
  9. int pth[N];  
  10.   
  11. int inv[N][N];  
  12.   
  13. bool prime[N];  
  14.   
  15. int fac[N][N];  
  16.   
  17. int k=0;  
  18.   
  19. void isprime()  
  20. {  
  21.     int i,j;  
  22.     memset(prime,true,sizeof(prime));  
  23.     memset(pth,0,sizeof(pth));  
  24.     for(i=2;i<N;i++)  
  25.     {  
  26.         if(prime[i])  
  27.         {  
  28.             prim[++k]=i;  
  29.             pth[i]=k;  
  30.             for(j=i+i;j<N;j+=i)  
  31.             {  
  32.                 prime[j]=false;  
  33.             }  
  34.         }  
  35.     }  
  36. }  
  37.   
  38. int quick_mod(int a,int b,int m)  
  39. {  
  40.     int ans=1;  
  41.     a%=m;  
  42.     while(b)  
  43.     {  
  44.         if(b&1)  
  45.         {  
  46.             ans=ans*a%m;  
  47.             b--;  
  48.         }  
  49.         b>>=1;  
  50.         a=a*a%m;  
  51.     }  
  52.     return ans;  
  53. }  
  54.   
  55. void init()  
  56. {  
  57.     int i,j;  
  58.     for(int i=1;i<=k;i++)  
  59.     {  
  60.         fac[i][0]=inv[i][0]=1;  
  61.         for(j=1;j<prim[i];j++)  
  62.         {  
  63.             fac[i][j]=(fac[i][j-1]*j)%prim[i];  
  64.             inv[i][j]=quick_mod(fac[i][j],prim[i]-2,prim[i]);  
  65.         }  
  66.     }  
  67.   
  68. }  
  69.   
  70. int C(int n,int m)  
  71. {  
  72.     if(m>n) return 0;  
  73.     if(m==n) return 1;  
  74.     int t=pth[p];  
  75.     return fac[t][n]*(inv[t][n-m]*inv[t][m]%p)%p;  
  76. }  
  77.   
  78. int Lucas(int n,int m)  
  79. {  
  80.     if(m==0)  return 1;  
  81.     return C(n%p,m%p)*Lucas(n/p,m/p)%p;  
  82. }  
  83.   
  84. int main()  
  85. {  
  86.     int n,m,k=1;  
  87.     isprime();  
  88.     init();  
  89.     while(~scanf("%d%d%d",&n,&m,&p))  
  90.     {  
  91.         if(m<=n/2) m=n-m;  
  92.         printf("Case #%d: %d\n",k++,(m%p+Lucas(n+1,m+1)%p)%p);  
  93.     }  
  94.     return 0;  
  95. }  

抱歉!评论已关闭.