bzoj 5323: [Jxoi2018]游戏
2018-07-14 11:44
281 查看
Description
题面Solution
注意到我们只关心不能被其他数筛掉的数 , 也就是不存在取值在 \([l,r]\) 的约数的数.最后一个满足这个条件的数出现的位置就是游戏的轮数.
我们只关心满足这个条件的数的数量 , 设为 \(c\) , 那么枚举最后一个出现的位置 \(i\) 来算贡献.
设 \(n=r-l+1\) , \(ans=c!*(n-c)!*\sum_{i=c}^{n}C_{i-1}^{c-1}*i\)
我们要找到这个数的最大约数来判断是否在 \([l,r]\) 内 , 找出最小质数就行了 , 可以线性筛.
#include<bits/stdc++.h> using namespace std; const int N=1e7+10,mod=1e9+7; inline int qm(int x,int k){ int sum=1; for(;k;k>>=1,x=1ll*x*x%mod)if(k&1)sum=1ll*sum*x%mod; return sum; } int l,r,prime ,num=0,f ,inv ,Fac ;bool vis ; inline void priwork(){ Fac[0]=Fac[1]=f[1]=1; for(register int i=2,t;i<=r;i++){ Fac[i]=1ll*Fac[i-1]*i%mod; if(!vis[i])prime[++num]=i,f[i]=i; for(int j=1;j<=num && i*prime[j]<=r;j++){ vis[t=i*prime[j]]=1,f[t]=min(prime[j],f[i]); if(i%prime[j]==0)break; } } inv[r]=qm(Fac[r],mod-2); for(register int i=r-1;i>=0;i--)inv[i]=1ll*inv[i+1]*(i+1)%mod; } inline int C(int a,int b){return 1ll*Fac[a]*inv[b]%mod*inv[a-b]%mod;} int main(){ freopen("pp.in","r",stdin); freopen("pp.out","w",stdout); cin>>l>>r; priwork(); int c=0,ans=0; for(register int i=l;i<=r;i++)if(i/f[i]<l)++c; if(!c)++c; for(register int i=r-l+1;i>=c;i--)ans=(ans+1ll*i*C(i-1,c-1))%mod; ans=1ll*ans*Fac[c]%mod*Fac[r-l+1-c]%mod; cout<<ans; return 0; }
相关文章推荐
- BZOJ5323 & 洛谷4562:[JXOI2018]游戏——题解
- BZOJ5323 [Jxoi2018]游戏 【数论/数学】
- bzoj 5288: [Hnoi2018]游戏
- [BZOJ5288][HNOI2018]游戏(拓扑排序)
- [BZOJ5329][SDOI2018]战略游戏(圆方树+虚树)
- bzoj 5329: [Sdoi2018]战略游戏
- bzoj 5285: [Hnoi2018]寻宝游戏
- BZOJ.5329.[SDOI2018]战略游戏(圆方树 虚树)
- BZOJ5324 & 洛谷4563 & LOJ2545:[JXOI2018]守卫——题解
- bzoj 5303: [Haoi2018]反色游戏
- BZOJ1059: [ZJOI2007]矩阵游戏
- bzoj 2940: [Poi2000]条纹 (Multi-SG游戏)
- 【bzoj3240 && 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)
- Bzoj1188 [HNOI2007]分裂游戏
- 体用UGP VR眼镜一体机下载体验玩2018《VR女友》游戏后感:太真实了!
- ●BZOJ 1444 [Jsoi2009]有趣的游戏
- 【BZOJ】【P1115】【POI2009】【石子游戏Kam】【题解】【Nim】
- BZOJ-1455 罗马游戏
- BZOJ 4515: [Sdoi2016]游戏
- [BZOJ1025][SCOI2009]游戏