這題做的時候接連想錯了好多次……但是回到正軌上之後依然是乙個套路題。(不過這題好像有比莫比烏斯反演更好的做法,莫比烏斯反演貌似是某種能過的暴力ヽ(´ー`)┌)不過能過也就行了吧哈哈。
首先我們把數字的範圍要進行縮小:最大公約數為 \(k\) 那自然所有選出來的數都必須是 \(k\) 的倍數。所以我們改選數為選擇是 \(k\) 的多少倍。然後由於是最大公約數,所以選出來的這些數必須最大公約數等於\(1\)。實際上多個數的最大公約數\( = 1\)完全可以和兩個數的最大公約數 \( = 1\) 用一樣的方法去反演。只不過這題由於資料範圍非常的大,所以處理 \(\mu\) 的字首和必須要使用杜教篩。
#include usingnamespace
std;
#define maxn 1000300
#define db double
#define int long long
int maxx = maxn - 1e2, mod = 1e9 + 7
;int
n, k, l, h, ans, sum[maxn];
inttot, pri[maxn];
map
map;
bitset
is_prime;
intread()
while(c >= '
0' && c <= '
9') x = x * 10 + c - '
0', c =getchar();
return x *k;
}int qpow(int x, int
times)
void
get_mu()
else sum[tem] = -sum[i];}}
for(int i = 1; i <= maxx; i ++) sum[i] = (sum[i] + sum[i - 1]) %mod;
}int mu(int
x)
return map[x] = (1 - ret + mod) %mod;
}int solve(int n, int
m)
return
ret;
}signed main()
遞推 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 選數 解題報告
我們知道,從區間 l,h l 和 h 為整數 中選取 n 個整數,總共有 h l 1 n 種方案。小 z 很好奇這樣選出的數的最大公約數的規律,他決定對每種方案選出的 n 個整數都求一次最大公約數,以便進一步研究。然而他很快發現工作量太大了,於是向你尋求幫助。你的任務很簡單,小 z 會告訴你乙個整數...
cqoi2015部分題解
只做了前三題。t1 選數 先把題目轉化為求選n個數最大公約數為1,不用說了。假定f i 為選出n個數最大公約數為i的方案數。由於題目中有條件h l 10 5,所以i 10 5即可。令l l 1 i,r h i f i r l n sigma f a i r l 最後的r l為減去全部選擇乙個數的方案...