HDU 5768 Lucky7 數論 中國剩餘定理

2021-07-15 19:26:31 字數 1566 閱讀 3625

求[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 的值。一開始看題,以為類似機械人路徑問題,...