扩欧求调,100pts
查看原帖
扩欧求调,100pts
799098
chengzihan620楼主2023/12/18 17:04
#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace mathmech{
	int binpow(int k,int n){
		int res=1;
		while(n){
			if(n&1)res*=k;
			k*=k;
			n>>=1;
		}
		return res;
	}
	int modpow(int k,int n,int mod){
		int res=1;
		while(n){
			if(n&1)res=res*k%mod;
			k=k*k%mod;
			n>>=1;
		}
		return res%mod;
	}
	int phi(int n){
		int ans=n;
		for(int i=2;i*i<=n;i++)
			if(n%i==0){
				ans=ans/i*(i-1);
				while(n%i==0)n/=i;
			}
		if(n>1)ans=ans/n*(n-1);
		return ans;
	}
	int exgcd(int a,int b,int& x,int& y){
		if(b>a)return exgcd(b,a,x,y);
		if(b==0){
			x=1;y=0;
			return a;
		}else{
			int x1;
			int d=exgcd(b,a%b,x1,x);
			y=x1-a/b*x;
			return d;
		}
	}
	int CRT(int k,int*a,int*r){
		int n=1,ans=0;
		for(int i=1;i<=k;i++)n*=r[i];
		for(int i=1;i<=k;i++){
			int m=n/r[i],b,y;
			exgcd(m,r[i],b,y);
			ans=(ans+a[i]*m*b%n)%n;
		}
		return ans%n?(ans%n+n)%n:n;
	}
	inline int read(){int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=(x<<3)+(x<<1)+c-'0';c=getchar();}return x*f;}
	void Write(int x){if(x<0){x=-x;putchar('-');}if(x){Write(x/10);putchar(x%10+'0');}}
	void write(int x){Write(x);putchar('\n');}
}
using namespace mathmech;
int a[1234569],n;                                                                                                                                                                                                                                 
const int mod=10007,fai=10006; 
int solve(int k){
	if(k==n){
		if(a[n]<=fai)return a[n];
		else return a[n]%fai;
	}
	int v=solve(k+1);
	return modpow(a[k],v,fai);
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++)
		cin>>a[i];
	cout<<modpow(a[1],solve(2),mod);
	return 0;
}
2023/12/18 17:04
加载中...