hdu3944(Lucas定理+预处理)
来源:互联网 发布:节假日堵车数据 编辑:程序博客网 时间:2024/06/05 15:39
hdu3944(Lucas定理+预处理)
分类: 数论2013-03-24 14:32 50人阅读 评论(0) 收藏 举报
题目:DP?
对于本题,由于访问的次数很大,所以当然得先预处理保存在数组中,然后用的时候就不用一次一次的再重复计算了,本题重在预处理。
- #include <stdio.h>
- #include <string.h>
- #define N 10005
- int p;
- int prim[N];
- int pth[N];
- int inv[N][N];
- bool prime[N];
- int fac[N][N];
- int k=0;
- void isprime()
- {
- int i,j;
- memset(prime,true,sizeof(prime));
- memset(pth,0,sizeof(pth));
- for(i=2;i<N;i++)
- {
- if(prime[i])
- {
- prim[++k]=i;
- pth[i]=k;
- for(j=i+i;j<N;j+=i)
- {
- prime[j]=false;
- }
- }
- }
- }
- int quick_mod(int a,int b,int m)
- {
- int ans=1;
- a%=m;
- while(b)
- {
- if(b&1)
- {
- ans=ans*a%m;
- b--;
- }
- b>>=1;
- a=a*a%m;
- }
- return ans;
- }
- void init()
- {
- int i,j;
- for(int i=1;i<=k;i++)
- {
- fac[i][0]=inv[i][0]=1;
- for(j=1;j<prim[i];j++)
- {
- fac[i][j]=(fac[i][j-1]*j)%prim[i];
- inv[i][j]=quick_mod(fac[i][j],prim[i]-2,prim[i]);
- }
- }
- }
- int C(int n,int m)
- {
- if(m>n) return 0;
- if(m==n) return 1;
- int t=pth[p];
- return fac[t][n]*(inv[t][n-m]*inv[t][m]%p)%p;
- }
- int Lucas(int n,int m)
- {
- if(m==0) return 1;
- return C(n%p,m%p)*Lucas(n/p,m/p)%p;
- }
- int main()
- {
- int n,m,k=1;
- isprime();
- init();
- while(~scanf("%d%d%d",&n,&m,&p))
- {
- if(m<=n/2) m=n-m;
- printf("Case #%d: %d\n",k++,(m%p+Lucas(n+1,m+1)%p)%p);
- }
- return 0;
- }
利用Lucas定理再论组合数奇偶性
分类: 数论2013-03-24 12:05 56人阅读 评论(0) 收藏 举报对于组合数C(n,m),我们想知道他为奇数还是偶数,当然我们有(n&k)==k这个神器,但是用这个就得枚举,如果数太大果断超时,比如HDU4349题,就是
说C(n,0),C(n,1),....C(n,n)中奇数有多少个,n范围是10^8,这里就用了Lucas定理了。
对于n,m根据Lucas定理,我们先把他们转化为二进制,这样n,m都是01序列了。
这样我们可以看出C(0,1)=0,C(0,0)=1,C(1,0)=1,C(1,1)=1,这样n中为0的地方对应的m中的位置我们只有一种可能,那就是0,不然C(n,m)就成0了,所以
这样我们可以不用管n中为0的地方,只考虑n中为1的位置,当然很明显可以看出,n中为1的位置对应的m中为0或1,其结果都是1,所以这样一来答案就直
接相当于是1<<(n中1的个数)了。
其实除了这样,直接找规律也是可以的,只是那样很麻烦,不容易看出来。然后我们现在就可以将看似很难的HDU4349水之了。
其实关于(n&k)==k的证明也就很容易了,同样的方法利用Lucas啊。。。
题目1:Xiao Ming's Hope
- #include <stdio.h>
- int main()
- {
- int n;
- while (~scanf("%d",&n))
- {
- int count = 0;
- while (n)
- {
- if (n&1) count++;
- n>>=1;
- }
- printf("%d\n",1<<count);
- }
- return 0;
- }
题目2:Binomial Coefficients注意(n&k)==k与n&k==k不一样。
- #include <stdio.h>
- int main()
- {
- int n,k;
- while(~scanf("%d%d",&n,&k))
- {
- if((n&k)==k)
- {
- printf("1\n");
- }
- else
- {
- printf("0\n");
- }
- }
- return 0;
- }
- hdu3944(Lucas定理+预处理)
- hdu3944(Lucas定理+预处理)
- hdu3944 lucas定理+阶乘预处理
- HDU3944 DP? (LUCAS定理+阶乘预处理)
- hdu3944 DP? (lucas定理+预处理)
- lucas定理+费马小定理方法求逆元-HDU3944
- HDU3944-DP?(帕斯卡公式+Lucas定理)
- HDU3944 DP?(大组合数取模:lucas定理)
- [HDU3944]DP? (组合数学Lucas定理)
- A(HDU3944)---Lucas
- HDU 3944-DP?(Lucas定理+预处理)
- 【HDU3944 】DP?【LUCAS定理+阶乘预处理】 【杨辉三角中的点(第n行m列),问你从(0,0)点走到该点经过的点最少的权值和(只能向下走或斜着走)。同时对素数p取余】
- Lucas 定理
- Lucas 定理
- lucas定理
- Lucas定理
- Lucas 定理
- Lucas 定理
- 告诫自己的话
- POJ2454--Jersey Politics
- 明明是有这个包的,但是导不进去
- 两个View 使用BLOCK传值
- android开发之修改全局自定义字体
- hdu3944(Lucas定理+预处理)
- python创建和解析xml文件
- GitHub上最火的74个Android开源项目
- Q5+maxim dl
- Beijing 2008 / UVa 1428 / POJ 3928 / HDU 2492 Ping pong (树状数组)
- Knockout.js随手记(7)
- php+mysql+apache环境配置(我配过一遍成功)
- Chapter 5, Django database layer
- linux修改文件权限和用户组管理小结