NC50597. 序列统计
描述
输入描述
输入第一行包含一个整数T,表示数据组数。
第二到第T+1行每行包含三个整数N,L和R,N,L和R的意义如题所述。
输出描述
输出包含T行,每行有一个数字,表示你所求出的答案对取模的结果。
示例1
输入:
2 1 4 5 2 4 5
输出:
2 5
说明:
对于第一组输入,满足条件的两个序列为{4 }, {5 }。Java 解法, 执行用时: 431ms, 内存消耗: 27916K, 提交时间: 2021-08-19 11:56:48
import java.io.*; import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; import java.text.DecimalFormat; import java.util.*; public class Main { static long mod = 1; static class SegmentTree { static int l; static int r; static long v; static Node root; static long cache[]; static void build(long f[]) { cache = f; root = new Node(0, f.length - 1); } static long query(int left, int right) { l = left; r = right; return root.query(); } static void add_range(int left, int right, long value) { l = left; r = right; v = value; v%= mod; root.add_range(); } static void multi_range(int left, int right, long value) { l = left; r = right; v = value; v%= mod; root.multi_range(); } static void set_range(int left, int right) { l = left; r = right; // root.set_range(); } static class Node { // boolean seted; long setv = 1; long add = 0; int left; int right; long min_value; Node l_node; Node r_node; public Node(int l, int r) { left = l; right = r; if (l == r) { min_value = cache[l]%mod; } else { int mid = (l + r) >> 1; l_node = new Node(l, mid); r_node = new Node(mid + 1, r); pollup(); } } private long query() { if (l <= left && r >= right) { return min_value; } else if (l > right || r < left) { return 0; } else { pushdown(); long v1 = l_node.query(); long v2 = r_node.query(); pollup(); return (v1+v2)%mod; } } private void add_range() { if (l <= left && r >= right) { add += v; add %= mod; min_value += v *(right-left+1); min_value %= mod; } else if (l > right || r < left) { return; } else { pushdown(); l_node.add_range(); r_node.add_range(); pollup(); } } private void multi_range() { if (l <= left && r >= right) { setv *= v; setv %= mod; add = add*v; add %= mod; min_value = (min_value * v) % mod; } else if (l > right || r < left) { return; } else { pushdown(); l_node.multi_range(); r_node.multi_range(); pollup(); } } // private void set_range() { // if (l <= left && r >= right) { // seted = true; // setv = v; // add = 0; // min_value = v; // } else if (l > right || r < left) { // return; // } else { // pushdown(); // l_node.set_range(); // r_node.set_range(); // pollup(); // } // } // first multi, then add private void pushdown() { if (setv!=1) { l_node.setv *= setv; l_node.setv %= mod; r_node.setv *= setv; r_node.setv %= mod; l_node.min_value = l_node.min_value*setv%mod; r_node.min_value = r_node.min_value*setv%mod; l_node.add = l_node.add*setv; l_node.add %= mod; r_node.add = r_node.add*setv; r_node.add %= mod; setv = 1; } if (add != 0) { l_node.add += add; l_node.add %= mod; r_node.add += add; r_node.add %= mod; l_node.min_value += add * (l_node.right - l_node.left + 1 ); l_node.min_value %= mod; r_node.min_value += add * (r_node.right - r_node.left + 1 ); r_node.min_value %= mod; add = 0; } } private void pollup() { min_value = (l_node.min_value + r_node.min_value)%mod; } } } static class Task { public static String roundS(double result, int scale) { String fmt = String.format("%%.%df", scale); return String.format(fmt, result); // DecimalFormat df = new DecimalFormat("0.000000"); // double result = Double.parseDouble(df.format(result)); } public void solve(int testNumber, InputReader in, PrintWriter out) { mod = 1000003; f = new long[1000004]; rev = new long[1000004]; f[0] = 1; for(int j=1;j<1000003;++j){ f[j] = f[j-1]*j%mod; } rev[1000002] = mod_pow(f[1000002],mod-2,mod); for(int j=1000001;j>=0;--j){ rev[j] = rev[j+1] * (j+1) %mod; } // int n = in.nextInt(); // int m = in.nextInt(); int t = in.nextInt(); for(int i=0;i<t;++i) { int n = in.nextInt(); int l = in.nextInt(); int r = in.nextInt(); int m = r-l+1; long s = 0; // for (int j = 1; j <= n; ++j) { // // c(1+x,1) , c(2+x,2), c(n+x,n); // // // // (1+x)!/(x!)*(1!) (2+x)!/(x!)*(2!) // // s += lucas(j + m - 1, j); // s %= mod; // } s = lucas(n+m,n) + mod -1; s %= mod; out.println(s); } } long f[]; long rev[]; // long qq(int n,int m){ // if(m==n||m==0) { return 1;} // return C(n%mod,m%mod); // } long P(int n,int m){ return f[n]*rev[n-m]%mod; } long lucas(int n,int m){ long ans = 1; while(n!=0&&m!=0&&ans!=0){ ans = ans * C((int)(n%mod), (int)(m%mod)) %mod; n /= mod; m /= mod; } return ans; } long C(int n,int m){ if(n<m) { return 0; } // return f[n]*rev[m]%mod*rev[n-m]%mod; long s1 = 1; long s2 = 1; for(int j=1;j<=m;++j){ s1 *= (n-j+1); s1 %= mod; s2 *= j; s2 %= mod; } long res= s1 * mod_pow(s2, mod-2, mod) % mod; return res; } // int t = in.nextInt(); // int n = in.nextInt(); // int m = in.nextInt(); // // ct = 0; // h = new int[n];Arrays.fill(h,-1); // if(t==1) { // to = new int[m * 2]; // ne = new int[m * 2]; // // fob = new boolean[m * 2]; // }else{ // to = new int[m]; // ne = new int[m]; // // } // // // int rd[] = new int[n]; // int cd[] = new int[n]; // li = new int[m]; // tp = m-1; // // int rt= 0; // // for(int i=0;i<m;++i){ // int u = in.nextInt()-1; // int v = in.nextInt()-1; // add(u,v); // if(t==1){ // add(v,u); // } // cd[u]++; // rd[v]++; // rt = u; // } // // if(t==2){ // // for(int i=0;i<n;++i){ // if(rd[i]!=cd[i]){ // out.println("NO");return; // } // } // }else{ // // for(int i=0;i<n;++i){ // if(((rd[i]+cd[i])%2)>0){ // out.println("NO");return; // } // } // // } // // // // dfs11(rt, t); // // // // if(tp!=-1){ // out.print("NO"); // return; // } // // out.println("YES"); // // for(int i=0;i<m;++i){ // out.print(li[i]+ " "); // } // int f1[][] = new int[q][3]; // // for(int i=0;i<q;++i){ // for(int j=0;j<3;++j){ // f1[i][j] = in.nextInt(); // } // } // // // int h[] = new int[n+1]; // // Arrays.fill(h,-1); // // // int ne[] = new int[p*2+q]; // int to[] = new int[p*2+q]; // int wt[] = new int[p*2+q]; // ct = 0; // Func fk = (int x,int y,int z) -> { // to[ct] = y; // ne[ct] = h[x]; // wt[ct] = z; // h[x] = ct++; // }; // // for(int i=0;i<p;++i){ // int u = f[i][0]; // int v = f[i][1]; // // // // // fk.add(u,v,f[i][2]); // fk.add(v,u,f[i][2]); // } // // for(int i=0;i<q;++i){ // int u = f1[i][0]; // int v = f1[i][1]; // // // // // fk.add(u,v,f1[i][2]); // } // int dp[] = new int[n+1]; // Arrays.fill(dp,100000000); // dp[s] = 0; // // // PriorityQueue<int[]> qu = new PriorityQueue<>(Comparator.comparingInt((x)->x[0])); // qu.add(new int[]{0,s}); // while(qu.size()>0){ // int cc[] = qu.poll(); // int cur = cc[1]; // if(cc[0]!=dp[cur]) continue; // for(int j = h[cur];j!=-1;j=ne[j]){ // int v = to[j]; // if(dp[v] > dp[cur] + wt[j]){ // dp[v] = dp[cur] + wt[j]; // qu.offer(new int[]{dp[v],v}); // } // } // } // // for(int j=1;j<=n;++j){ // if(dp[j]==100000000){ // out.println("NO PATH"); // }else{ // out.println(dp[j]); // } // } // for(int t=0;t<5;++t) { // int at = fi[t]; // dp[at][t] = 0; // PriorityQueue<int[]> q = new PriorityQueue<>(Comparator.comparingInt((x) -> x[0])); // q.offer(new int[]{0, at}); // while (q.size() > 0) { // int cur[] = q.poll(); // if (cur[0] != dp[cur[1]][t]) continue; // int i = cur[1]; // for (int j = h[i]; j != -1; j = ne[j]) { // int v = to[j]; // if (dp[i][t] + wt[j] < dp[v][t]) { // dp[v][t] = dp[i][t] + wt[j]; // q.offer(new int[]{dp[v][t], v}); // } // } // } // } // int cl[] = new int[]{0,1,2,3,4}; // int rs = Integer.MAX_VALUE; // do{ // int s= dp[1][cl[0]]; // for(int j=0;j<4;++j){ // int nxt = fi[cl[j+1]]; // s += dp[nxt][cl[j]]; // } // rs = Math.min(rs,s); // // // }while(next_perm(cl)); // // out.print(rs); boolean next_perm(int[] a) { int len = a.length; for (int i = len - 2, j = 0; i >= 0; --i) { if (a[i] < a[i + 1]) { j = len - 1; for (; a[j] <= a[i]; --j) ; int p = a[j]; a[j] = a[i]; a[i] = p; j = i + 1; for (int ed = len - 1; j < ed; --ed) { p = a[ed]; a[ed] = a[j]; a[j++] = p; } return true; } } return false; } static long mul(long a, long b, long p) { long res = 0, base = a; while (b > 0) { if ((b & 1L) > 0) res = (res + base) % p; base = (base + base) % p; b >>= 1; } return res; } static long mod_pow(long k, long n, long p) { long res = 1L; long temp = k % p; while (n != 0L) { if ((n & 1L) == 1L) { res = mul(res, temp, p); } temp = mul(temp, temp, p); n = n >> 1L; } return res % p; } public static double roundD(double result, int scale) { BigDecimal bg = new BigDecimal(result).setScale(scale, RoundingMode.UP); return bg.doubleValue(); } } private static void solve() { InputStream inputStream = System.in; // InputStream inputStream = null; // try { // inputStream = new FileInputStream(new File("D:\\chrome_download\\exp.out")); // } catch (FileNotFoundException e) { // e.printStackTrace(); // } OutputStream outputStream = System.out; // OutputStream outputStream = null; // File f = new File("D:\\chrome_download\\"); // try { // f.createNewFile(); // } catch (IOException e) { // e.printStackTrace(); // } // try { // outputStream = new FileOutputStream(f); // } catch (FileNotFoundException e) { // e.printStackTrace(); // } InputReader in = new InputReader(inputStream); PrintWriter out = new PrintWriter(outputStream); Task task = new Task(); task.solve(1, in, out); out.close(); } public static void main(String[] args) { // new Thread(null, () -> solve(), "1", (1 << 30)).start(); solve(); } static class InputReader { public BufferedReader reader; public StringTokenizer tokenizer; public InputReader(InputStream stream) { reader = new BufferedReader(new InputStreamReader(stream), 32768); tokenizer = null; } public String nextLine() { String line = null; try { line = reader.readLine(); } catch (IOException e) { throw new RuntimeException(e); } return line; } public String next() { while (tokenizer == null || !tokenizer.hasMoreTokens()) { try { tokenizer = new StringTokenizer(reader.readLine()); } catch (IOException e) { throw new RuntimeException(e); } } return tokenizer.nextToken(); } public int nextInt() { return Integer.parseInt(next()); } public char nextChar() { return next().charAt(0); } public int[] nextArray(int n) { int res[] = new int[n]; for (int i = 0; i < n; ++i) { res[i] = nextInt(); } return res; } public long nextLong() { return Long.parseLong(next()); } public double nextDouble() { return Double.parseDouble(next()); } } }
C++(g++ 7.5.0) 解法, 执行用时: 35ms, 内存消耗: 16060K, 提交时间: 2023-03-03 10:27:47
#include<iostream> #include<cstdio> #define mod 1000003 using namespace std; typedef long long ll; int n,m,l,r,T; ll fac[mod+5],infa[mod+5]; void init(){ int i; fac[0] = infa[1] = infa[0] = 1; for( i = 1; i < mod; i++ ) fac[i] = fac[i-1]*i%mod; for( i = 2; i < mod; i++ ) infa[i] = (mod-mod/i)*infa[mod%i]%mod; for( i = 1; i < mod; i++ ) infa[i] = (infa[i]*infa[i-1])%mod; } ll C( int n, int m ){ if( n < m ) return 0; if( n < mod && m < mod ) return fac[n] * infa[m] % mod * infa[n-m] % mod; else return C(n%mod,m%mod)*C(n/mod,m/mod)%mod; } int main(){ init(); scanf("%d", &T); while(T--){ scanf("%d%d%d", &n, &l, &r); m = r - l + 1; printf("%lld\n",(C(m+n,n)+mod-1)%mod); } return 0; }
C++ 解法, 执行用时: 20ms, 内存消耗: 16040K, 提交时间: 2021-06-13 15:13:34
#include<bits/stdc++.h> using namespace std; const long long P = 1e6+3; long long inv[P+1]; long long fac[P+1]; void init() { inv[1] = 1; for (int i = 2; i <= P; i++) inv[i] = (P-P/i)*inv[P%i]%P; fac[0] = 1; for (int i = 1; i <= P; i++) fac[i] = fac[i-1]*i%P; } long long C(int N, int M) { if (N < M) return 0; if (N < P && M < P) return fac[N]*inv[fac[N-M]]%P*inv[fac[M]]%P; return C(N/P, M/P)*C(N%P, M%P)%P; } int main() { init(); int T; cin >> T; while (T--) { int N, L, R; cin >> N >> L >> R; cout << (C(R-L+1+N, N) + P-1)%P << endl; } }