洛谷 P2155 [SDOI2008] 沙拉公主的困惑

P2155 [SDOI2008] 沙拉公主的困惑(线性筛,逆元)

题目入口

题解
我们知道 g c d ( m ! + k , m ! ) = g c d ( k , m ! ) gcd(m!+k,m!)=gcd(k,m!) gcd(m!+k,m!)=gcd(k,m!)
k > m ! k>m! k>m! 不妨令 k = m ! + c k=m!+c k=m!+c
于是 g c d ( k , m ! ) = g c d ( c , m ! ) gcd(k,m!)=gcd(c,m!) gcd(k,m!)=gcd(c,m!)
我们目标求 1 − n ! 1-n! 1n! g c d ( i , m ! ) = = 1 gcd(i,m!)==1 gcd(i,m!)==1的个数
可以将 n ! n! n!分成 n ! / m ! n!/m! n!/m!
每一份为 m ! m! m! 其中与 m ! m! m!互质的数的个数为phi(m!)
当m为质数时 p h i ( m ! ) = p h i ( ( m − 1 ) ! ) ∗ ( m − 1 ) phi(m!)=phi((m-1)!)*(m-1) phi(m!)=phi((m1)!)(m1)
当m不为质数时 p h i ( m ! ) = p h i ( ( m − 1 ) ! ) ∗ m phi(m!)=phi((m-1)!)*m phi(m!)=phi((m1)!)m
所以答案为 n ! m ! p h i ( m ! ) \frac{n!}{m!phi(m!)} m!phi(m!)n!
注意本题又模数与除数非互质的情况,也就是 r ∣ m ! r|m! rm!,此时重新处理阶乘即可

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e7+5;
int prime[N],phi[N],cnt;
bool vis[N];
int fac[N];
int x,y;
int exgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x=1;
        y=0;
        return a;
    }
    int res=exgcd(b,a%b,x,y);
    int tmp=x;
    x=y;
    y=tmp-(a/b)*y;
    return res;
}
void init(int n,int mod)
{
    phi[1]=1;
    fac[0]=fac[1]=1;
    for(int i=2;i<=n;i++)
    {
        fac[i]=fac[i-1]*i%mod;
        if(!vis[i]) prime[++cnt]=i,phi[i]=phi[i-1]*(i-1)%mod;
        else phi[i]=phi[i-1]*i%mod;
        for(int j=1;prime[j]*i<=n;j++)
        {
            vis[i*prime[j]]=true;
            if(i%prime[j]==0) break;
        }
    }
}
int qpow(int a,int n,int mod)
{
    int res=1;
    while(n)
    {
        if(n&1) res=res*a%mod;
        a=a*a%mod;
        n>>=1;
    }
    return res;
}

signed main()
{
    int t,mod;
    cin>>t>>mod;
    init(N-4,mod);
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        if(m%mod) cout<<fac[n]*phi[m]%mod*qpow(fac[m],mod-2,mod)%mod<<endl;
        else
        {
            int tmp=1;
            for(int i=m+1;i<=n;i++) (tmp*=i)%=mod;
            cout<<tmp*phi[m]%mod<<endl;
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
谷歌浏览器是一款功能强大的浏览器,用户可以通过配置沙拉查词插件来提升其使用体验。 首先,要配置沙拉查词插件,我们需要在谷歌浏览器的应用商店中搜索并下载沙拉查词插件。下载完成后,点击浏览器右上角的菜单按钮,选择"更多工具",然后点击"扩展程序"。 在扩展程序页面,我们可以看到已安装的插件列表。找到沙拉查词插件,确保其处于启用状态。接下来,我们可以点击插件旁边的"选项"按钮,进入沙拉查词的设置界面。 在沙拉查词的设置界面中,我们可以根据个人需求进行配置。例如,设置是否在鼠标停留在单词上时自动弹出翻译结果,选择显示的翻译来源等。配置完成后,点击保存并关闭设置界面。 现在,我们可以在实际使用谷歌浏览器的过程中体验沙拉查词的功能了。当我们阅读网页或者文档时,只需将鼠标停留在一个单词上,沙拉查词插件就会自动弹出一个翻译结果的小窗口,显示该单词的释义、例句等信息。 沙拉查词还支持划词翻译,即通过鼠标左键按住并拖动选中一段文本,插件会在右下角显示一个翻译结果的弹窗。这在阅读长文本或者需要翻译段落的情况下非常方便。 总之,通过配置沙拉查词插件,我们可以方便快捷地在谷歌浏览器中进行单词或者文本的翻译,大大提高了我们的使用效率和阅读体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值