Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task 数学 mod运算的性质

C. Ehab and a 2-operation task 数学 mod运算的性质

题意: 有两种对前缀的运算
1.对前缀每一个(a +x)
2.对前缀每一个(amod(x))
其中x任选

思路:这里只有加法 所以膜运算可以看作是减法 而膜运算当成减法使用需要合理运用其性质
(a[i]=k*n+b)
(a[i]equiv{b}pmod{m})
只要使得(a[i]==i)即可满足题意
而由上式我们知道(a[i]equiv{b}pmod{m}) 只要看(b)(a[i])的对应位置i相差多少 加上即可 最后在对整个区间进行(mod(n))
其中注意膜注意取正值 也就是((i-b+n)mod(n)) 最后一个数%n ==0要特殊处理一下
从后往前使得一个一个满足即可

#include<bits/stdc++.h>
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;i++)
#define MS(arr,arr_value) memset(arr,arr_value,sizeof(arr)) 
#define F first 
#define S second
#define pii pair<int ,int >
#define mkp make_pair
#define pb push_back
#define arr(zzz) array<ll,zzz>
using namespace std;
typedef long long ll;
const int maxn=1e5;
int a[maxn];
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	ll presum=0;
	if(n==1){cout<<0;return 0;
	}
	cout<<n+1<<endl;
	for(int i=n;i>=1;i--){
		a[i]+=presum;
		a[i]%=n;
		int tmp=i-a[i];
		if(tmp<=0)tmp+=n;
		//cout<<tmp<<endl;
		presum+=tmp;
		printf("%d %d %d
",1,i,tmp);
	}
	printf("2 %d %d
",n-1,n);
	return 0;
}
原文地址:https://www.cnblogs.com/ttttttttrx/p/10799938.html