求[l,r]範圍內是7的倍數,同時不滿足任意乙個給定的同余式的數的個數。如範圍為[1,100],不滿足模3餘2或模5餘3的7的倍數有7,21,42,49,70,84,91 ,故答案為7.
其中除數都為非7的素數(≤
105) ,除數的乘積小於
1018
.同余式最多有15個。
所有[l,r]範圍內7的倍數減去滿足任意乙個同余式的數,即得到了答案。而當乙個數可以滿足多個同余式時,很自然想到了用容斥原理來解決問題。當滿足奇數個條件時要減去這個集合,反之則加。
中國剩餘定理解決的是同時滿足多個同余式的解。因此215
範圍內列舉出各種同余式的組合的解,即可搞出答案了。
//解方程組x=ai(mod mi) mi之間兩兩互質
int china(int r)
return ans;
}
特別注意中間解出每個滿足的x時,都要取最小的正整數解,否則後面的乘法裡會爆long long(就算不爆,這個答案也不對,畢竟m[i]是m的約數,x經過處理會變小)。ans是不斷迭代得到的解,是要模m的。
出題人還是善良,在算ans過程中還是可以搞出資料爆long long
的,這樣就要快速乘法來搞了。注意乘數必須是正數(小小斌死於此hhh)
/*--------------------------------------------
* file name: hdu 5768
* author: danliwoo
* mail: [email protected]
* created time: 2016-07-28
18:59:37
--------------------------------------------*/
#include
using namespace std;
#define n 20
#define ll long long
ll a[n], m[n];
ints[n], n;
ll extend_euclid(ll a, ll b, ll &x, ll &y)
ll r = extend_euclid(b, a%b, y, x);
y -= a/b*x;
return r;
}ll gao(ll x, ll r, ll p)
ll mult(ll a, ll k, ll m)
return res;
}ll china(ll l, ll r)
for(int i = 0;i <= n;i++) if(s[i])
ll ret = gao(r+m, ans, m) - gao(l-1+m, ans, m);
return ret;
}int main()
k = k & 1 ? -1 : 1;
ans += 1ll * k * china(l, r);
}printf("case #%d: %lld\n", ++o, ans);
}return
0;}
uoj576 服務排程
先考慮乙個子問題 僅有乙個詢問且無修改 對每一種顏色的貢獻分類討論,結論 最遠的點一定這些點集中 任意一組 最遠點對中的兩個點 選擇較遠的乙個 證明 設 dis x,y 為 x 到 y 的距離,deep 表示以 k 為根時 x 的深度 假設這個點集中最遠點為 x,y 而最深的點為 z 且 deep ...
Leetcode 576 出界的路徑數
給定乙個 m n 的網格和乙個球。球的起始座標為 i,j 你可以將球移到相鄰的單元格內,或者往上 下 左 右四個方向上移動使球穿過網格邊界。但是,你最多可以移動 n 次。找出可以將球移出邊界的路徑數量。答案可能非常大,返回 結果 mod 109 7 的值。示例 1 輸入 m 2,n 2,n 2,i ...
leetcode576 出界的路徑數
題目 給定乙個 m n 的網格和乙個球。球的起始座標為 i,j 你可以將球移到相鄰的單元格內,或者往上 下 左 右四個方向上移動使球穿過網格邊界。但是,你最多可以移動 n 次。找出可以將球移出邊界的路徑數量。答案可能非常大,返回 結果 mod 10 9 7 的值。一開始看題,以為類似機械人路徑問題,...