杭电多校 Harvest of Apples 莫队
生活随笔
收集整理的這篇文章主要介紹了
杭电多校 Harvest of Apples 莫队
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題 B: Harvest of Apples
時間限制:?1 Sec??內存限制:?128 MB
提交:?78??解決:?35
[提交] [狀態] [討論版] [命題人:admin]
題目描述
There are n apples on a tree, numbered from 1 to n.
Count the number of ways to pick at most m apples.
?
輸入
The first line of the input contains an integer T (1≤T≤105) denoting the number of test cases.
Each test case consists of one line with two integers n,m (1≤m≤n≤105).
?
輸出
For each test case, print an integer representing the number of ways modulo 109+7.
?
樣例輸入
2 5 2 1000 500?
樣例輸出
16 924129523?
[提交][狀態]
官方題解
重點就是劃出來的公式,然后套莫隊即可
代碼:
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+100; #define INF 0x3f3f3f; const int mod=1e9+7; typedef long long ll; struct node {ll n,m;int p; }s[maxn]; ll block; ll fac[maxn],inv[maxn]; ll ans[maxn]; ll noww; ll qpow(ll x,ll y){ll ret = 1;while(y){if(y&1) ret = ret * x % mod;x = x * x % mod;y >>= 1;}return ret; } void init(){fac[0] = 1;for(int i=1; i<maxn; i++) fac[i] = fac[i-1] * i % mod;inv[maxn-1] = qpow(fac[maxn-1],mod-2);for(int i=maxn-2; i>=0; i--) inv[i] = inv[i+1] * (i+1) % mod; } ll C(ll x,ll y) {return fac[x] * inv[y] %mod * inv[x-y] % mod; } bool cmp(node x,node y) {if(x.n / block == y.n / block) return x.m < y.m;return x.n / block < y.n / block; } int main() {int t;scanf("%d",&t);block = sqrt(maxn);init();for(int i=0; i<t; i++){scanf("%lld%lld",&s[i].n,&s[i].m);s[i].p = i;}sort(s,s + t,cmp);ll l = 1,r = 1;noww = 2;for(int i=0; i<t; i++){while(l < s[i].n){l++;noww = (2 * noww % mod - C(l-1,r) + mod) % mod;}while(l > s[i].n){noww = (noww + C(l-1,r)) % mod * inv[2] % mod;l--;}while(r < s[i].m){r++;noww = (noww + C(l,r)) % mod;}while(r > s[i].m){noww = (noww + mod - C(l,r)) % mod;r--;}ans[s[i].p] = noww;}for(int i=0; i<t; i++){printf("%lld\n",ans[i]);}return 0; }剛剛學了莫隊,趕緊把原來兩個莫隊給補了
轉載于:https://www.cnblogs.com/renxiaomiao/p/9642664.html
總結
以上是生活随笔為你收集整理的杭电多校 Harvest of Apples 莫队的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux日常管理-防火墙selinux
- 下一篇: How to install share