题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2982
卢卡斯定理裸题;
原准备1A来着,结果输出忘了加回车!
预处理阶乘或者现求都可以,感觉学到了一种现求 C 的写法呢。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; int T,n,m,mod=10007; ll fac[10010]; void init() { fac[0]=1; for(int i=1;i<=mod;i++) fac[i]=(fac[i-1]*i)%mod; } ll pw(ll a,int b) { ll ret=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1)ret=(ret*a)%mod; return ret; } int C(int n,int m) { if(n<m)return 0;// return (fac[n]*(pw((ll)fac[m]*fac[n-m],mod-2)%mod))%mod; } //int C(int n,int m) //{ // if(n<m)return 0; // m=min(m,n-m);// // int a=1,b=1; // for(int i=n-m+1;i<=n;i++)a=(a*i)%mod; // for(int i=1;i<=m;i++)b=(b*i)%mod; // return (a*pw(b,mod-2))%mod; //} int Lucas(int n,int m) { if(m==0)return 1; return (C(n%mod,m%mod)*Lucas(n/mod,m/mod))%mod; } int main() { init(); scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); printf("%d ",Lucas(n,m)%mod); } return 0; }