【NOIP2018模拟赛2018.10.20】蒲公英的约定

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41709770/article/details/83239712

题目

在这里插入图片描述
在这里插入图片描述


题解

–这一看就是数论题。。。个鬼呀
发现最后要使异或值为0,那lastans必须要等于c
然后又因为lastans^ c=b <=> lastans=b ^ c
所以我们倒着异或,就可以得到每个x,再快速幂,得到每个b
就可以得到所有答案

这种恶心的题
绝对有毒


代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=1e5+5;

int p;
int n,a[MAXN],c[MAXN];
int x[MAXN],b[MAXN];

int Pow(long long a,int b){
	long long ans=1;
	while(b){
		if(b&1)
			ans=(ans*a)%p;
		a=(a*a)%p;
		b>>=1;
	}
	return ans%p;
}

int main(){
	cin>>p;
	n=1;
	while(scanf("%d%d",&a[n],&c[n])==2)
		n++;
	n--;
	for(int i=n-1;i>=1;i--){
		x[i]=b[i+1]^c[i+1];
		b[i]=Pow(1ll*a[i],x[i]);
	}
	for(int i=1;i<n;i++)
		printf("%d\n",x[i]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41709770/article/details/83239712
今日推荐