序列统计

// 序列统计.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*


http://ybt.ssoier.cn:8088/problem_show.php?pid=1657


https://loj.ac/p/10235


原题来自:BZOJ 4403

给定三个正整数 N,L 和 R,统计长度在 1 到 N 之间,元素大小都在 L 到 R 之间的单调不降序列的数量。输出答案对 106+3 取模的结果。

【输入】
输入第一行包含一个整数 T,表示数据组数。

第二到第 T+1 行每行包含三个整数 N,L 和 R,N,L 和 R 的意义如题所述。

【输出】
输出包含 T 行,每行有一个数字,表示你所求出的答案对 106+3 取模的结果。

【输入样例】
2
1 4 5
2 4 5
【输出样例】
2
5
【提示】
样例说明

对于第一组输入,满足条件的两个序列为 {4},{5}。

数据范围与提示:

对于全部输入,1≤N,L,R≤109,1≤T≤100,输入数据保证 L≤R。
*/

#include <iostream>


using namespace std;

typedef long long LL;

const int P = 1000003;


int qmi(int a, int k) {
	int res = 1;
	while (k) {
		if (k & 1) res = (LL)res * a % P;
		a = (LL)a * a % P;
		k >>= 1;
	}
	return res;
}

int C(int a, int b) {
	if (a < b) return 0;
	
	int down = 1, up = 1;
	for (int i = a, j = 1; j <= b; i--, j++) {
		up = (LL)up * i % P;
		down = (LL)down * j % P;
	}

	return (LL)up * qmi(down, P - 2) % P;
}

int lucas(int a, int b) {
	if (a < P && b < P) return C(a,b);
	return (LL)lucas(a / P, b / P) * lucas(a % P, b % P) % P;
}




int main()
{
	int T;
	cin >> T;
	while (T--) {
		int n, l, r; cin >> n >> l >> r;
		cout << (lucas(r - l + n + 1, r - l + 1) - 1+P) % P << endl;
	}


	return 0;
}

posted on 2025-04-01 17:22  itdef  阅读(26)  评论(0)    收藏  举报

导航