A. 【例题1】计算系数
解题思路
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<set>
#define ll long long
#define ldb long double
using namespace std;
const ll mod=10007;
ll a,b,k,n,m,c[1010][1010];
ll poww(ll a,ll x)
{
ll ans=1,base=a;
while(x)
{
if(x&1)ans=ans*base%mod;
base=base*base%mod;
x=x>>1;
}
return ans;
}
int main(){
scanf("%lld%lld%lld%lld%lld",&a,&b,&k,&n,&m);
for(int i=1;i<=k;i++)
c[i][i]=c[i][0]=1;
for(int i=2;i<=k;i++)
{
for(int j=1;j<=min(n,m);j++)
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
printf("%lld",c[k][min(n,m)]*poww(a,n)%mod*poww(b,m)%mod);
}
B. 【例题2】方案统计
解题思路
卢卡斯定理:
注意除的时候求逆元
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<set>
#define ll long long
#define ldb long double
using namespace std;
const ll mod=10007;
int t;
ll n,m,fac[10007];
ll ksm(ll a,ll x)
{
ll ans=1,base=a%mod;
while(x)
{
if(x&1)ans=ans*base%mod;
base=base*base%mod;
x=x>>1;
}
return ans;
}
ll C(ll n,ll m)
{
if(n<m)return 0;
return (fac[n]*ksm(fac[m],mod-2))%mod*ksm(fac[n-m],mod-2)%mod;
}
ll lucas(ll n,ll m){
if(m==0)
return 1;
return C(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;
}
int main(){
fac[0]=fac[1]=1;
for(int i=2;i<=mod;i++)
fac[i]=fac[i-1]*i%mod;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%lld%lld",&n,&m);
printf("%lld\n",lucas(n,m));
}
}
C. 【例题3】古代猪文
解题思路
》》洛谷LINK
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#define ll long long
#define ldb long double
using namespace std;
const ll Mod=999911658,mod[5]= {0,2,3,4679,35617};
ll n,g,a[5],pw[40010];
ll ksm(ll a,ll x,ll mod) {
ll ans=1,base=a;
while(x) {
if(x&1)ans=ans*base%mod;
base=base*base%mod;
x=x/2;
}
return ans;
}
ll C(ll n,ll m,ll mod) {
if(n<m)return 0;
return pw[n]*ksm(pw[m],mod-2,mod)%mod*ksm(pw[n-m],mod-2,mod)%mod;
}
ll Lucas(ll n,ll m,ll mod) {
if(n<m)return 0;
if(n==0)return 1;
return C(n%mod,m%mod,mod)*Lucas(n/mod,m/mod,mod)%mod;
}
ll work() {
ll ans=0;
for(int i=1; i<=4; i++) {
ll M=Mod/mod[i],t=ksm(M,mod[i]-2,mod[i]);
ans=(ans+M*a[i]%Mod*t%Mod)%Mod;
}
return ans;
}
int main() {
scanf("%lld%lld",&n,&g);
g=g%(Mod+1);
if(g==0) {
printf("0\n");
return 0;
}
for(int k=1; k<=4; k++) {
pw[0]=1;
for(int i=1; i<=mod[k]; i++)
pw[i]=pw[i-1]*i%mod[k];
for(int i=1; i*i<=n; i++) {
if(n%i==0) {
a[k]=(a[k]+Lucas(n,i,mod[k]))%mod[k];
if(i*i!=n) a[k]=(a[k]+Lucas(n,n/i,mod[k]))%mod[k];
}
}
}
ll ans=work();
printf("%lld",ksm(g,ans,Mod+1));
}