題意:給定兩個區間 [a, b], [c, d],問有多少個有序對 (x, y)(x >= a && x <= b && y >= c && y <= d)使得,(x*y)= 0(mod 2018)。
輸入:a, b, c, d。
資料範圍:多組輸入,所有輸入均為[1, 1e9]。
題解:因為範圍太大,所以暴力(n^2)是不可能的了,但是可以注意到的是,2018的因子為1, 2, 1009, 2018,以此為突破口分別計算
技巧:計算[l,r]內的x的倍數的個數可以用下面公式o(1)得到,不需要暴力跑
公式:sum = r / x - l / x + (l % x == 0 ? 1 : 0);
可以先計算兩個區間內2018的倍數,因為2018乘任何數都為2018的倍數,然後計算出分別為t1和t2,則ans += t1 (d - c + 1) + t2 (b - a + 1) - t1 * t2; 最後減掉t1 * t2的原因是計算重複,容斥。
同理計算其他的個數。
#include
using
namespace
std;
const
int maxn = 2e5 + 10;
typedef
long
long ll;
int main()
t3 -= t1;
ll t4 = d / 1009 - c / 1009;
if(c % 1009 == 0) t4++;
t4 -= t2;
ll t5 = b / 2 - a / 2;
if(a % 2 == 0) t5++;
ll t6 = d / 2 - c / 2;
if(c % 2 == 0)
ans += t3 * (t6 - t2) + t4 * (t5 - t1);
printf("%lld\n", ans);
}return
0;}
hdu 4135,數學 容斥
題意 求 a,b 區間裡面,與c互質的數的個數。範圍 0分析 先將c分解質因數,根據c的範圍可以判斷質數的範圍不超過x個。x 自己線性篩素數後,從小到大乘一下,看當乘到多少個的時候,積大於10 9,則可以判斷c的最多質因數個數 假設c的質因數有2,3,5 則 a,b 區間裡,包含質因數2的數的個數為...
HDU 2204(容斥原理 數學)
2015 05 14 19 35 28 題目 每次給出乙個n n 10 18 讓你求出1 n中能表示成m k的數的個數。思路 比較明顯可以用容斥解的題目.但是要注意細節。首先,觀察 k 的最大值,2 60 10 18,所以 k 60,所以我們可以列舉一下 k 的值。對於每個 k,直接計算出最大可能的...
數學知識 容斥原理
容斥原理 aubuc a b c a b a c b c a b c a 表示集合a中元素的個數 推廣 例題 能被整除的數 給定乙個整數n和m個不同的質數p1,p2,pm。請你求出1 n中能被p1,p2,pm中的至少乙個數整除的整數有多少個。輸入格式 第一行包含整數n和m。第二行包含m個質數。輸出格...