NC19467. 期望操作数
描述
输入描述
第一行一个数T
接下来T行
每行两个整数 x, q (x <= q)
输出描述
输出T行
第 i 行的正整数 表示第i次询问的答案。
示例1
输入:
2 7 8 15 18
输出:
2 831870297
说明:
对于第一个样例C++14(g++5.4) 解法, 执行用时: 1104ms, 内存消耗: 166764K, 提交时间: 2018-09-28 21:14:38
#include<bits/stdc++.h> using namespace std; const int mod=998244353; long long sum[10000007],inv[10000007]; int main() { sum[0]=-1; sum[1]=1; inv[1]=1; for(int i=2;i<=10000000;++i) { inv[i]=1ll*(mod-(mod/i))*inv[mod%i]%mod; sum[i]=sum[i-1]+inv[i]; if(sum[i]>=mod) sum[i]-=mod; } int T,x,q; scanf("%d",&T); while(T--) { scanf("%d%d",&x,&q); printf("%lld\n",sum[q-x]==mod-1?0:sum[q-x]+1); } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 817ms, 内存消耗: 53220K, 提交时间: 2018-09-28 20:33:03
#include<cstdio> const int p=998244353; const int N=11000000; int inv[N],T,x,q; int main(){ scanf("%d",&T);inv[1]=inv[0]=1; for (int i=2;i<N;i++) inv[i]=(long long)((long long)(p-p/i)*(long long)inv[p%i])%p; for (int i=1;i<N;i++) inv[i]=(inv[i]+inv[i-1])%p; while (T--){ scanf("%d%d",&x,&q); printf("%d\n",inv[q-x]); } return 0; }