1. 程式人生 > >Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task 數學 mod運算的性質

Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task 數學 mod運算的性質

n) 一個 val 數學 註意 兩種 pmod 使用 back

C. Ehab and a 2-operation task 數學 mod運算的性質

題意: 有兩種對前綴的運算
1.對前綴每一個$a +x$
2.對前綴每一個$a\mod(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\n",1,i,tmp);
    }
    printf("2 %d %d\n",n-1,n);
    return 0;
}

Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task 數學 mod運算的性質