洛谷 CQOI2015 選數 解題報告

2022-04-30 02:48:10 字數 1539 閱讀 3260

我們知道,從區間\([l,h]\)(\(l\)和\(h\)為整數)中選取\(n\)個整數,總共有\((h-l+1)^n\)種方案。

小\(z\)很好奇這樣選出的數的最大公約數的規律,他決定對每種方案選出的\(n\)個整數都求一次最大公約數,以便進一步研究。然而他很快發現工作量太大了,於是向你尋求幫助。

你的任務很簡單,小\(z\)會告訴你乙個整數\(k\),你需要回答他最大公約數剛好為\(k\)的選取方案有多少個。由於方案數較大,你只需要輸出其除以\(1000000007\)的餘數即可。

輸入一行,包含\(4\)個空格分開的正整數,依次為\(n\),\(k\),\(l\)和\(h\)。

輸出乙個整數,為所求方案數。

對於\(100\%\)的資料,\(1 \le n, k \le 10^9\),\(1 \le l \le h \le 10^9\),\(h-l \le10^5\)

暴力反演一波你會發現要求這個式子

\[\sum_^\rfloor}\mu(d)(\lfloor\frac\rfloor}\rfloor-\lfloor\frac\rceil-1}\rfloor)

\]需要使用杜教篩,不想學,發現還有乙個神仙的\(dp\)

令\(r=\lfloor\frac\rfloor,l=\lceil\frac\rceil\)

問題等價於問互質的方案數

引理:區間\([l,r]\)任意兩個不相等數的最大公約數的大小不會超過\(r-l\)

證明:取任意互質的數\(a,b\),將它們同乘\(m\),而\(r-l\)取最小值時\((b-a)\times m \ge m\),得證

(證明是從別處抄的,說實話不太懂qaq)

設\(dp_\)代表以\(i\)為最大公約數的數量,且所選的數不全相等。

考慮\(g_i\)為\(i\)為約數的數量,同樣也是所選的不全相等。

(不全相等是處於統計方便考慮)

顯然\[g_i=(\lfloor\frac\rfloor-\lfloor\frac\rfloor)^n-(\lfloor\frac\rfloor-\lfloor\frac\rfloor)

\]根據容斥原理

\[dp_i=g_i-\sum_^rdp_d

\]注意要特判\(l=1\),因為這個時候可以全相等

code:

#include #define ll long long

const int n=1e5+10;

const ll mod=1e9+7;

ll n,k,l,r;

ll dp[n];

ll quickpow(ll d,ll k)

return f;

}int main()

for(ll i=r-l;i;i--)

for(ll j=i<<1;j<=r-l;j+=i)

(dp[i]-=dp[j])%=mod;

printf("%lld\n",(dp[1]+(l==1)+mod)%mod);

return 0;

}

2018.10.20

遞推 CQOI2015 選數

這個遞推實在是讓我感到無奈 實際上就是先計算出在l和r的區間中有多少個數有因數k 然後 f i 表示的就是在l和r中選出n個數最大公因數是i k 的方案數 然後 ll ll n l 1 i 1 ll rr n r i ll len rr ll 1 這幾句話的意思就是算出在n l 和 n r的範圍內有...

題解 CQOI2015選數

這題做的時候接連想錯了好多次 但是回到正軌上之後依然是乙個套路題。不過這題好像有比莫比烏斯反演更好的做法,莫比烏斯反演貌似是某種能過的暴力 不過能過也就行了吧哈哈。首先我們把數字的範圍要進行縮小 最大公約數為 k 那自然所有選出來的數都必須是 k 的倍數。所以我們改選數為選擇是 k 的多少倍。然後由...

洛谷1036 選數(DFS

已知 nn n 個整數 x1,x2,xnx 1,x 2,x nx1 x2 xn 以及 11 1 個整數 kk k k k n 從 nn n 個整數中任選 kk k 個整數相加,可分別得到一系列的和。例如當 n 4,k 3n 4,k 3n 4,k 3 44 4 個整數分別為 3,7,12,193,7,...