CF gym 10326040th Petrozavodsk Programming Camp, Day 5,2021.2.3 水题2题

Posted 小哈里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF gym 10326040th Petrozavodsk Programming Camp, Day 5,2021.2.3 水题2题相关的知识,希望对你有一定的参考价值。

M、Discrete Logarithm is a Joke

题意:

思路:

  • 不难想到an=g^{an+1},因为样例给了 a[1000000]的值,所以反着推就行了。
  • 记得开int128,longlong会爆,也不要用浮点数表示整数,double会爆,提交的时候选G++20,不然编译器会爆。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;

typedef __int128 LL;
inline __int128 read(){
	__int128 x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
inline void print(__int128 x){
	if(x<0){putchar('-');x=-x;}
	if(x>9)print(x/10);
	putchar(x%10+'0');
}

//const LL mod = 1e18+31;//WA
const LL mod = 1000000000000000031;//M 题别用浮点数表示整数
LL pows(LL a, LL x, LL p){ if(x==0)return 1; LL t = pows(a, x>>1,p);if(x%2==0)return t*t%p;return t*t%p*a%p;}

LL f[maxn];

int main(){
    int n = 1000000;
    f[n] = 300;
    for(int i = n-1; i >= 0; i--){
        f[i] = pows(42LL,f[i+1],mod);
    }
    int x;  cin>>x;
    print(f[x]);
    return 0;
}

/*
M = 1e18+31;
g = 42 是原根
[1,φ(M)],φ(M)=1e18+30,[1,1e18+30]
g^i, if gcd(i,φ(M))=1, i是原根,,即g^i同余1(mod M)
f(x)是下一个原根?
所以an = g^f(an)?
an = g^a[n+1]?

f(x)是
g^f(x)同余x(mod M), 
f(0) = a[0] = 960002411612632915;
a[1] = f(a[0]);
g^a[1]同余a[0] (mod M)
g^a[2]同余a[1] (mod M)

*/


J、Increasing or Decreasing

题意:

  • 给出两个长为n的排列,求构造一组操作次数不超过n次的方案让排列A变为排列B。
  • 每次操作可以选定一个区间[l, r]给其升序或降序排序。

思路:

  • 盲猜肯定需要n次,一次确定一个位置。所以想到先把1-n升序排序,然后从后往前枚举B序列,每次找到B[i]在A中的位置l,把l到当前B中未确定的r按照升序或降序排序后,B[i]就被放到了正确的位置。
  • 因为A数组每次都是对后缀进行升序或降序排序的,所以找到的那个A中的B[i],一定是他所在位置到B未确定的数的末位中的最大值或最小值,因为那一段都是单调的。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 550;
int a[maxn], b[maxn];
bool cmp(int x, int y){
    return x>y;
}
int main(){
    int n;  cin>>n;
    for(int i = 1; i <= n; i++)cin>>a[i];
    for(int i = 1; i <= n; i++)cin>>b[i];
    cout<<n<<"\\n";
    cout<<1<<" "<<n<<" "<<"I\\n";
    sort(a+1,a+n+1);
    for(int i = n; i >= 2; i--){
        int t = b[i];
        int l, r=i;
        for(int j = i; j >= 1; j--){
            if(a[j]==t){
                l = j;
                break;
            }
        }
        ///if(l==r)continue;
        if(a[l]>a[r]){
            sort(a+l,a+r+1);
            cout<<l<<" "<<r<<" "<<"I\\n";
        }else{
            sort(a+l,a+r+1,cmp);
            cout<<l<<" "<<r<<" "<<"D\\n";
        }
        //for(int i = 1; i <= n; i++)cout<<a[i]<<" ";cout<<"\\n";
    }
    //for(int i = 1; i <= n; i++)cout<<a[i]<<" ";cout<<"\\n";
    return 0;
}

以上是关于CF gym 10326040th Petrozavodsk Programming Camp, Day 5,2021.2.3 水题2题的主要内容,如果未能解决你的问题,请参考以下文章

cf gym gym 101177 A - Anticlockwise Motion

cf gym 100960 G. Youngling Tournament set+树状数组

cf gym 101124

CF Gym-101911A Coffee Break

CF Gym 102059E Electronic Circuit (set存图删点)

CF gym102759IQuery On A Tree 17