BZOJ 3930 [CQOI2015]选数
生活随笔
收集整理的這篇文章主要介紹了
BZOJ 3930 [CQOI2015]选数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接
https://lydsy.com/JudgeOnline/problem.php?id=3930
題解
反演得到
∑i=1?h/k?μ(i)(?hki???l?1ki?)n \sum_{i=1}^{\lfloor h/k\rfloor} \mu(i) (\lfloor \frac{h}{ki}\rfloor-\lfloor\frac{l-1}{ki}\rfloor)^n i=1∑?h/k??μ(i)(?kih????kil?1??)n
整除分塊直接算即可。
代碼
#include <map> #include <cstdio> #include <algorithm>int read() {int x=0,f=1;char ch=getchar();while((ch<'0')||(ch>'9')){if(ch=='-'){f=-f;}ch=getchar();}while((ch>='0')&&(ch<='9')){x=x*10+ch-'0';ch=getchar();}return x*f; }const int maxn=1000000; const int mod=1000000007; const int inf=0x3f3f3f3f;int p[maxn+10],prime[maxn+10],cnt,mu[maxn+10];int getprime() {p[1]=mu[1]=1;for(int i=2; i<=maxn; ++i){if(!p[i]){prime[++cnt]=i;mu[i]=mod-1;}for(int j=1; (j<=cnt)&&(i*prime[j]<=maxn); ++j){int x=i*prime[j];p[x]=1;if(i%prime[j]==0){mu[x]=0;break;}mu[x]=mod-mu[i];}}for(int i=1; i<=maxn; ++i){mu[i]+=mu[i-1];if(mu[i]>=mod){mu[i]-=mod;}}return 0; }std::map<int,int> mp;int getsum(int n) {if(n<=maxn){return mu[n];}if(mp.count(n)){return mp[n];}int ans=1;for(int l=2,r; l<=n; l=r+1){r=n/(n/l);ans-=1ll*(r-l+1)*getsum(n/l)%mod;if(ans<0){ans+=mod;}}return mp[n]=ans; }int n,k,s,t;int quickpow(int a,int b) {int res=1;while(b){if(b&1){res=1ll*res*a%mod;}a=1ll*a*a%mod;b>>=1;}return res; }int main() {getprime();n=read();k=read();s=read();t=read();int ans=0;for(int l=1,r; l<=t/k; l=r+1){r=inf;if(t/(l*k)!=0){r=std::min(r,t/(t/(l*k)));}if((s-1)/(l*k)!=0){r=std::min(r,(s-1)/((s-1)/(l*k)));}r/=k;ans=(ans+1ll*(getsum(r)-getsum(l-1)+mod)*quickpow((t/(k*l))-((s-1)/(k*l)),n))%mod;}printf("%d\n",ans);return 0; }轉載于:https://www.cnblogs.com/Canopus-wym/p/10376075.html
總結
以上是生活随笔為你收集整理的BZOJ 3930 [CQOI2015]选数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java B2B2C Springclo
- 下一篇: 【C++】 外传篇 2_函数的异常规格说