题目链接
我们称当一个数 kk 除了它本身的因数不在这个序列里的时候, kk 为特异数。
我们发现,当且仅当我们选完最后一个特异数的时候,整个数列被选完。
于是枚举每个位置为最后一个特异数的位置计算期望,答案为:
ans=∑ni=1i×sum×Cn−in−sum×(n−i)!×(i−1)!ans=i=1∑ni×sum×Cn−sumn−i×(n−i)!×(i−1)!
其中 ii 为选花费, sumsum 为特异数的个数
求逆元的时候要线性推,要不然会T
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
#include<bits/stdc++.h> using namespace std; const int MOD=1e9+7; const int MAXN=10000010; typedef long long ll; ll l,r; ll sum,ans; bool book[MAXN]; ll fact[MAXN]; ll inv[MAXN]; ll qpow(ll a,ll b,ll p){ ll ans=1; while(b){ if(b&1)ans=ans*a%p; a=a*a%p; b>>=1; } return ans; } void pre(){ for(int i=l;i<=r;i++){ if(book[i])continue; sum++; for(int j=i;j<=r;j+=i){ book[j]=1; } } fact[0]=1; for(int i=1;i<=r;i++){ fact[i]=fact[i-1]*i%MOD; } inv[r]=qpow(fact[r],MOD-2,MOD); for(int i=r-1;i>=0;i--){ inv[i]=inv[i+1]*(i+1)%MOD; } } ll C(ll n,ll m){ if(n<m)return 0; return fact[n]*inv[n-m]%MOD*inv[m]%MOD; } int main(){ cin>>l>>r; pre(); ll n=r-l+1; for(int i=1;i<=n;i++){ ans=(ans+i*C(n-sum,n-i)%MOD*fact[n-i]%MOD*fact[i-1]%MOD*sum%MOD)%MOD; } cout<<ans<<endl; return 0; } |