ACM数论 板子

#include<bits/stdc++.h>
using namespace std;
const int MAXN= 100005;
const int mod = 1e9+7;
typedef long long LL;
LL c[1005][1005];
LL mu[MAXN];
LL euler[MAXN];
int mu[MAXN];
void Mubius()//莫比乌斯函数
{
    mu[1]=1;
    for(int i=1;i<MAXN;++i)
    {
        for(int j=i+i;j<MAXN;j+=i)
        {
            mu[j]-=mu[i];
        }
    }
}
void extend_gcd(int a, int b, int &x, int &y)//扩展欧几里得
{
    if(x==0)
    {
        a=1;
        b=0;
        return ;
    }
    extend_gcd(b, a%b, x, y);
    int t=x;
    x=y;
    y=t-a/b*y;
    return ;
}
void comb()//组合数表
{
    c[0][0]=1;
    for(int i=1; i<1000; ++i)
    {
        c[i][0]=1;
        for(int j=1; j<=i; ++j)
        {
            c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
        }
    }
    return ;
}
void euler_t()//直接求欧拉函数值
{
    euler[1]=1;
    for(int i=2; i<MAXN; ++i)
        euler[i]=i;
    for(int i=2; i<MAXN; ++i)
    {
        if(euler[i]==i)
            for(int j=i; j<MAXN; j+=i)
            {
                euler[j]=euler[j]/i*(i-1);
            }
    }
}

LL quick_pow(LL a, LL b)//快速幂
{
    LL res=1;
    while(b)
    {
        if(b&1)
            res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
LL Comb(LL a,LL b, LL p)//求组合数
{
    if(a < b) return 0;
    if(a == b) return 1;
    if(b > a-b) b = a-b;
    LL ans = 1, ca = 1, cb = 1;
    for(LL i=0; i<b; ++i)
    {
        ca = (ca*(a-i))%p;
        cb = (cb*(b-i))%p;
    }
    ans = (ca*quick_pow(cb, mod-2))%mod;
    return ans;
}
LL Lucas(LL n, LL m)
{
    LL ans = 1;
    while(n && m && ans)
    {
        ans = (ans * Comb(n%mod, m%mod, mod))%mod;
        n /= mod;
        m /= mod;
    }
    return ans;
}
LL C(LL n, LL m)  
{  
    if(m > n) return 0;  
    LL ans = 1;  
    for(int i=1; i<=m; i++)  
    {  
        LL a = (n + i - m) % p;  
        LL b = i % p;  
        ans = ans * (a * quick_mod(b, p-2) % p) % p;  
    }  
    return ans;  
}  

LL Lucas(LL n, LL m)  
{  
    if(m == 0) return 1;  
    return C(n % p, m % p) * Lucas(n / p, m / p) % p;  
}  
*/
int get_euler(int n)//欧拉函数表
{
    int ans=n;
    for(int i=2; i*i<=n; ++i)
    {
        if(n%i==0)
        {
            ans=ans/i*(i-1);
            while(n%i==0)
                n/=i;
        }
    }
    if(n!=1)
        ans=ans/n*(n-1);
    return ans;
}
int main()
{
    comb();
    euler_t();
    LL a, b;
    while(~scanf("%lld %lld", &a, &b))
    {
        printf("%lld\n", Lucas(a, b, mod));
    }
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ACM Codebook(ACM代码手册)是一本整理了算法竞赛常用算法和数据结构的参考手册。它是为了帮助算法竞赛选手快速查阅各种算法和数据结构的实现而编写的。 ACM Codebook的内容非常丰富,包括了各种常用算法,如排序算法、图论算法、动态规划算法等。同时,它还包含了各种常用数据结构的实现,如链表、栈、队列、堆等。此外,ACM Codebook还介绍了一些常见的算法设计技巧和优化技巧,帮助选手更好地解决问题。 ACM Codebook的作用非常明显,首先它提供了各种算法和数据结构的实现代码,方便选手直接复制粘贴使用,节省了编写代码的时间。其次,ACM Codebook提供了详细的算法和数据结构的说明和示例,帮助选手理解和掌握这些算法和数据结构的原理和用法。最后,ACM Codebook还提供了一些常见问题的解决方案,帮助选手快速解决问题。 ACM Codebook的编写并不容易,需要作者具备扎实的算法和数据结构基础,并且对算法竞赛有深入的了解。编写ACM Codebook需要不断地修改和更新,以适应算法竞赛中不断变化的需求。 总之,ACM Codebook是一本非常有用的参考手册,它不仅提供了丰富的算法和数据结构的实现,还提供了对应的说明和示例,帮助算法竞赛选手快速掌握和应用这些算法和数据结构。它是算法竞赛选手在比赛中必备的工具之一。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值