Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task 數學 mod運算的性質
阿新 • • 發佈:2019-05-01
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運算的性質