比赛题目:
http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf
Problem J. Master of GCD
这道题利用差分的思想,对一个区间[l, r]每个元素加上x,可以变为对arr[l] + x,arr[r+1] - x。然后所有区间操作完之后用循环从第二个开始每个值等于自己与前面的值的和。
这里的时间复杂度是O(n),如果用暴力的话就是O(n2),肯定是过不去的。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define P pair <ll, ll>
const int MAXN = 1e5 + 7;
const ll mod = 998244353;
ll qpow(ll a, ll n)
{
ll re = 1;
while(n)
{
if(n&1)
re = (re * a)%mod;
n >>= 1;
a = (a * a)%mod;
}
return re;
}
int a[MAXN], b[MAXN];
int main()
{
ios::sync_with_stdio(0);
int t, n, m;
cin>>t;
while(t--)
{
memset(a, 0, sizeof a);
memset(b, 0, sizeof b);
cin>&