我們知道,從區間\([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,...