日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)

發(fā)布時(shí)間:2025/3/15 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

BZOJ 3930 Luogu P3172 選數(shù) (莫比烏斯反演)

手動(dòng)博客搬家:本文發(fā)表于20180310 11:46:11, 原地址https://blog.csdn.net/suncongbo/article/details/79506484

題目鏈接:
(Luogu)https://www.luogu.org/problemnew/show/P3172
(BZOJ)http://www.lydsy.com/JudgeOnline/problem.php?id=3930

題目大意:
給定N,M,L,R,從區(qū)間[L,R]內(nèi)選出N個(gè)整數(shù)使得它們的gcd恰好為m,求合法的選數(shù)方案數(shù)對(duì)1e9+7取模的值。1<=N,M,L,R<=1e9, R-L<=1e5.

思路分析:
gcd? 那就莫比烏斯反演好了。
令F(m)表示從[L,R]中選出N個(gè)數(shù),其gcd為m的倍數(shù)的方案數(shù)。
f(m)表示從[L,R]中選出N個(gè)數(shù),其gcd 恰好為m方案數(shù)。(莫比烏斯反演常見做法)
我們要求的是f(m),為了簡化運(yùn)算,我們令l等于大于等于L的最小的m的倍數(shù),r等于小于等于L的最大的m的倍數(shù)。然后l/=m,r/=m,問題轉(zhuǎn)化為求f(1). (莫比烏斯反演常見做法)
根據(jù)莫比烏斯反演公式\[F(n)=\sum_{n|d} f(d), f(n)=\sum_{n|d}\mu (\fracozvdkddzhkzd{n})F(d)\], F(n)可以O(shè)(1)求得,直接反演即可。
現(xiàn)在面臨兩個(gè)問題:

  • F(x)和f(x)的定義域是什么?
  • 如何O(1)求F(x)?
  • 先來解決第二個(gè)問題:
    F(x)其實(shí)就是[l,r]內(nèi)是x的倍數(shù)的數(shù)的個(gè)數(shù)的N次方,可以用快速冪求得。具體見代碼getF函數(shù)。

    難點(diǎn)在于第一個(gè)問題:
    首先我們知道,定義域不超過r. 而r=R/M是1e9級(jí)別的,因此必須優(yōu)化,發(fā)現(xiàn)更多的性質(zhì)。
    F(x)既然表示選出N個(gè)數(shù)gcd為x的方案數(shù),那我們觀察以下式子\[\gcd (x,y)\le y-x (x<y)\]如果選的數(shù)不全相等,那它們的gcd一定不會(huì)超過r-l, 也就是F(x)和f(x)的定義域就會(huì)縮小到r-l, 而r-l是1e5級(jí)別的!這就很美妙了!
    現(xiàn)在只要處理一下選出的所有數(shù)全相等的情況了。
    為了縮小定義域,我們給F(x)和f(x)分別添加一個(gè)條件: F(x)表示表示從[L,R]中選出不全相等的 N個(gè)數(shù),其gcd為x的倍數(shù)的方案數(shù),f(x)表示表示從[L,R]中選出不全相等的 N個(gè)數(shù),其gcd 恰好為x的方案數(shù),枚舉定義域[1,r-l]莫比烏斯反演求出f(1)即可。
    而定義變了以后,O(1)計(jì)算F(x)的方法也出現(xiàn)了變動(dòng): \[F(x)=a^N-a\]其中a為[l,r]內(nèi)是x的倍數(shù)的數(shù)的個(gè)數(shù)。公式解釋: 如果是隨意選,共有\(a^N\)種選法,然后去掉全部相等的選法,選N個(gè)全部相等的數(shù)就相當(dāng)于只選一個(gè)數(shù),因此有a種選法,從\(a^N\)中扣除。
    以上是計(jì)算f(1)的方法。
    f(1)算完后,還要加上從[l,r]中選N個(gè)全相等的數(shù)使得gcd為1的方案數(shù)。那顯然唯一方案就是全選1,如果1被包含在區(qū)間[l,r]中答案就是f(1)+1,否則答案為f(1).

    代碼實(shí)現(xiàn):

    #include<cstdio> using namespace std;const int N = 1e5+1; const long long P = 1e9+7; long long n,m,lb,rb; int mu[N+4]; long long p[N+4]; bool f[N+4]; int pn;void Mobius() {mu[1] = 1; pn = 0;for(int i=2; i<=N; i++){if(!f[i]) {pn++; p[pn] = i; mu[i] = -1;}for(int j=1; j<=pn && i*p[j]<=N; j++){f[p[j]*i] = true;if(i%p[j]==0) {mu[i*p[j]] = 0; break;}else mu[i*p[j]] = -mu[i];}} }long long quickpow(long long a,long long b) {a %= P;long long cur = a,ret = 1ll;for(int i=0; b; i++){if(b&(1ll<<i)) {ret *= cur; ret %= P; b-=(1ll<<i);}cur *= cur; cur %= P;}return ret; }long long getF(long long a) {long long lt,rt;if(lb%a>0ll) lt = lb/a+1;else lt = lb/a;rt = rb/a;return (quickpow(rt-lt+1,n)-(rt-lt+1)+P)%P; }int main() {Mobius();scanf("%lld%lld%lld%lld",&n,&m,&lb,&rb);if(lb%m>0ll) lb = lb/m+1;else lb = lb/m;rb/=m;long long nn = rb-lb,ans = 0ll;for(int i=1; i<=nn; i++){ans += mu[i]*getF(i);ans = (ans+P)%P;}if(lb<=1 && 1<=rb) {ans++; ans%=P;}printf("%lld\n",ans);return 0; } 發(fā)表于 2019-01-02 13:38 suncongbo 閱讀(...) 評(píng)論(...) 編輯 收藏 刷新評(píng)論刷新頁面返回頂部

    總結(jié)

    以上是生活随笔為你收集整理的BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。