• 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;
    }
    
  • 相关阅读:
    C# 课堂总结2-数据类型及转换方式
    C# 课堂总结1-二进制转换
    C++
    C++ 程序设计语言
    VS编译器问题总结
    go 笔记
    SIP协议 会话发起协议(二)
    SIP协议 会话发起协议(一)
    201707 一些好的文章
    编程拾穗
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/10799938.html
Copyright © 2020-2023  润新知