2 条题解
-
6
这道题用双重和式可以做,提供另一个思路:贡献法。 a[l]到a[r]之间总共有(r-l+1)个数,每个数都和其他的(r-l)个数配成一个和,所以答案就应该是(s[r]-s[l-1])%MOD*(r-l)%MOD
参考代码
#include <iostream> #include <algorithm> using namespace std; const int MAXN = 100005; const int MOD = 10007; int n, a[MAXN], s[MAXN],t[MAXN],T; int main() { cin >> n >>T; for (int i = 1; i <= n; i++) { cin >> a[i]; s[i] = s[i - 1] + a[i]; } while(T--) { int l,r; cin>>l>>r; cout<<(s[r]-s[l-1])%MOD*(r-l)%MOD<<endl; } return 0; }
-
1
这道题目可以用双重和式来解决,非常简单,在看里面的那一层西格玛的时候,可以把它处理成一个常数a[i]*(r-l)+一个变量a[j]+a[j+1]+a[j+2]+...a[n]可以用前缀和来进行优化sum[r]-sum[i]
#define mod 10007 using namespace std; int a[100001],sum[100001]; int main() { int n,T; cin >> n >> T; for(int i=1;i<=n;i++) { cin >> a[i]; sum[i]=(sum[i-1]%mod+a[i]%mod)%mod; } for(int j=1;j<=T;j++) { int l,r; cin >> l >> r; long long s=0; for(int i=l;i<=r;++i) { s=((s+a[i]%mod*(r-i)%mod+sum[r]-sum[i])+mod)%mod; } cout << s%mod << '\n'; } }
- 1
信息
- ID
- 652
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 123
- 已通过
- 66
- 上传者