2 条题解

  • 6
    @ 2024-1-10 19:29:49

    这道题用双重和式可以做,提供另一个思路:贡献法。 \\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
      @ 2024-4-23 20:45:50

      这道题目可以用双重和式来解决,非常简单,在看里面的那一层西格玛的时候,可以把它处理成一个常数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
      上传者