首页 > 其他 > 详细

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

时间:2019-05-01 16:12:34      阅读:137      评论:0      收藏:0      [点我收藏+]

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运算的性质

原文:https://www.cnblogs.com/ttttttttrx/p/10799938.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!