Submission #15505

# Submission time Handle Problem Language Result Execution time Memory
15505 2015-07-12T08:38:05 Z tonyjjw 괄호 문자열 (kriii3_R) C++14
73 / 113
1590 ms 181224 KB
#include<stdio.h>
#include<vector>
#define ML 1000000
#pragma warning(disable:4996)

using namespace std;

typedef long long ll;

int p,q,mod,Q;
ll pow2[ML+1];
ll A[ML+1];

long long gcd(long long a,long long b) {
	if(b == 0) return a;
	return gcd(b,a % b);
}

pair<long long,long long> extended_gcd(long long a,long long b) {
	if(b == 0) return make_pair(1,0);
	pair<long long,long long> t = extended_gcd(b,a % b);
	return make_pair(t.second,t.first - t.second * (a / b));
}

long long modinverse(long long a,long long m) {
	return (extended_gcd(a,m).first % m + m) % m;
}

long long chinese_remainder_two(long long a1,long long n1,long long a2,long long n2)
{
	return ( a1*n2*modinverse(n2,n1) + a2 * n1 * modinverse(n1,n2) ) % (n1*n2);
}

pair<long long,long long> chinese_remainder(vector<long long> a,vector<long long> n) {
	pair<long long,long long> res(a[0],n[0]);
	for(int i = 1; i < a.size(); i++){
		auto g = gcd(res.second,n[i]);
		if((a[i] - res.first) % g) {
			res = make_pair(-1,-1);
			break;
		}
		res.first = chinese_remainder_two(res.first / g,res.second / g,a[i] / g,n[i] / g) * g + a[i] % g;
		res.second = res.second / g * n[i];
		res.first %= res.second;
	}
	return res;
}

ll pow(ll a,ll p,ll m){
	ll v=1;
	while(p>0){
		if(p&1)v=v*a%m;
		a=a*a%m;
		p>>=1;
	}
	return v;
}

struct NUM{
	ll p,f;
	ll a,b;
	NUM(){}
	NUM(ll p_,ll f_,ll a_,ll b_){
		p=p_,f=f_,a=a_,b=b_;
	}
	NUM operator /(NUM A)const{
		return NUM(p,f,a-A.a,b*modinverse(A.b,f)%f);
	}
	NUM operator *(NUM A)const{
		return NUM(p,f,a+A.a,b*A.b%f);
	}
	ll get(){
		return pow(p,a,f)*b%f;
	}
};

vector<NUM> C[ML+1];

NUM convert(ll v,ll p,ll f){
	ll a=0;
	while(v%p==0)v/=p,a++;
	ll b=v%f;
	return NUM(p,f,a,b);
}

int main(){
	scanf("%d%d%d%d",&p,&q,&mod,&Q);
	if(p==1 && q==0){	//subtask 1
		vector<ll> factor;
		vector<ll> prime;
		int L;
		int tmod=mod;
		for(int i=2;i*i<=tmod;i++){
			if(tmod%i)continue;
			int v=1;
			while(tmod%i==0)tmod/=i,v*=i;
			factor.push_back(v);
			prime.push_back(i);
		}
		if(tmod!=1)factor.push_back(tmod),prime.push_back(tmod);

		for(L=1,pow2[0]=1%mod;L<=ML;L++){
			pow2[L]=pow2[L-1]*2%mod;
		}

		for(int i=0;i<factor.size();i++){
			ll pp=prime[i];
			ll mod=factor[i];
			C[1].push_back(convert(1,pp,mod));
			for(L=2;L<=ML;L++){
				NUM one=convert(2,pp,mod);
				NUM two=convert(2*L-1,pp,mod);
				NUM three=convert(L+1,pp,mod);
				C[L].push_back(one*C[L-1].back()*two/three);
			}
		}
		for(int i=0;i<Q;i++){
			scanf("%d",&L);
			if(L&1){
				printf("%lld\n",pow2[L]);
				continue;
			}
			vector<ll> tmp;
			for(auto c:C[L/2])tmp.push_back(c.get());
			ll v=pow2[L]-chinese_remainder(tmp,factor).first;
			v%=mod;
			if(v<0)v+=mod;
			printf("%lld\n",v);
		}
	}
	else if(p==0 && q==1){	//subtask 2
		int L;
		for(L=1,pow2[0]=1%mod;L<=ML;L++){
			pow2[L]=pow2[L-1]*2%mod;
		}
		for(A[1]=0,A[2]=2%mod,L=1;L<=ML-2;L++){
			int m=L/2+1;
			A[L+2]=4*A[L]+(pow2[m]-A[m])*pow2[L+2-2*m];
			A[L+2]%=mod;
			if(A[L+2]<0)A[L+2]+=mod;
		}
		for(int i=0;i<Q;i++){
			scanf("%d",&L);
			ll v=pow2[L]-A[L];
			v%=mod;
			if(v<0)v+=mod;
			printf("%lld\n",v);
		}
	}
	return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 733 ms 118656 KB Output is correct
2 Correct 1590 ms 181224 KB Output is correct
3 Correct 1451 ms 181224 KB Output is correct
4 Correct 1449 ms 181224 KB Output is correct
5 Correct 984 ms 118656 KB Output is correct
6 Correct 607 ms 87504 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 63 ms 40644 KB Output is correct
2 Correct 83 ms 40644 KB Output is correct
3 Correct 89 ms 40644 KB Output is correct
4 Correct 96 ms 40644 KB Output is correct
5 Correct 75 ms 40644 KB Output is correct
6 Correct 86 ms 40644 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 4 ms 40640 KB Output isn't correct
2 Halted 0 ms 0 KB -