专栏文章

题解:SP25584 FCDC - Factorial Modulo

SP25584题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mimyokhn
此快照首次捕获于
2025/12/01 17:43
3 个月前
此快照最后确认于
2025/12/01 17:43
3 个月前
查看原文

题目大意

给定两个整数 a,ba,b,求满足 ai!a \mid i!bi!b \nmid i! 的整数 ii 的数量。
首先可以发现,如果 ai!a \mid i!,那对于 k1k\geq1a(i+k)!a \mid (i+k)!
因此,我们可以分解 n,mn,m 后用二分找满足条件的区间,即为:
找到 min(i)\min (i) 使得 ai!a \mid i!
找到 min(j)\min (j) 使得 aj!a \mid j!
输出区间
CPP
#include<bits/stdc++.h>
using namespace std;
#define N 10010
int count(int x,int shu)
{
    int cnt=0;
    while(x>0) x/=shu,cnt+=x;
    return cnt;
}
int solve(int a)
{
    if(a==1) return 1;
    int res=0;
    for(int i=2;i*i<=a;i++)
        if(a%i==0)
        {
            int cnt=0;
            while(a%i==0) cnt++,a/=i;
            int l=1,r=1e6,ans=0;
            while(l<=r)
            {
                int mid=l+r>>1;
                if(count(mid,i)>=cnt)
                    ans=mid,r=mid-1;
                else l=mid+1;
            }//二分
            res=max(res,ans);
        }
    res=max(res,a);//剩下的也要计算
    return res;
}
int n,m;
int main()
{
    cin>>n>>m;
    int ans=max(0,solve(m)-solve(n));
    cout<<ans;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...