2019 ACM 난창 (南昌) 국립 초대 Xyjj의 순서는 (오일러 + DP 내림차순)

주제 출처 : https://nanti.jisuanke.com/t/40255

오일러 제 카운트 값 내려와 표제의 의미를 이해하고 DP 계산된다.

주제 메모리 카드의 보충 DP 어레이는 그 어레이의 형태로 시작 압연을 산출 할 필요가 있고, 또는 RE 것이다.

당신이 MOD 사용할 수있는 참고 지수입니다 시간을 계산하거나 빨리 정상적인 전력을 시작하는 최 외층 때문에.

그것은 DP를 구비 한 시퀀스의 상대적인 순서가 변경되지 B, 그렇게 때문에 DP는 대형는 [2] [I] [J], DP [0/1] [I]은 [J]는 어레이를 나타낸다 후 i 번째 이전 j 번째 MAX 0 또는 1 B 어레이의 정면 끝을 나타내는 또는 양도의 어레이가 형성 ^ N (2)로 배열 b 끝나는.

이어서 스크롤 대신 계산하도록 배열 단지 확인 값 길게.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<map>
#include<queue>
#define MAX_len 50100*4
using namespace std;
typedef long long ll;
const ll p=1e5+3;
const ll MAX=1e5+10;
ll aa[5010],bb[5010];
ll phi[MAX],dp[2][2][5010];
ll MOD(ll n,ll mod)
{
    return n<mod?n:(n%mod+mod);
}
void Euler()
{
     phi[1]=1;  
     for(ll i=2;i<MAX;i++)  
       phi[i]=i;  
     for(ll i=2;i<MAX;i++)  
        if(phi[i]==i)
           for(ll j=i;j<MAX;j+=i)  
              phi[j]=phi[j]/i*(i-1);
}
ll quickpow(ll a,ll n,ll mod)
{
    ll res=1;
    while(n)
    {
        if(n&1)
        {
             res=MOD(a*res,mod);
        }
        n>>=1;
         a=MOD(a*a,mod);
    }
    return res;
}
ll fastpow(ll a,ll n,ll mod)
{
	ll res=1;
	while(n)
	{
		if(n&1)
		res=(res*a)%mod;
	n/=2;
		a=(a*a)%mod;
	}
	return res;
} 
ll solve(ll a,ll b,ll mod)
{
    if(b==1||mod==1)
    return MOD(a,mod);
    {
    	return quickpow(a,solve(a,b-1,phi[mod]),mod);
	}
}
int main()
{
	Euler();
	int a,b,i,j,n;
	scanf("%d %d",&a,&b);
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&aa[i]);
		if(a==1)
		{
			aa[i]=1;
			continue;
		}
		else
		{
			aa[i]=fastpow(a,solve(b,aa[i],phi[p]),p);
		}
	}
	for(i=1;i<=n;i++)
	{
		scanf("%d",&bb[i]);
		if(a==1)
		{
			bb[i]=1;
			continue;
		}
		else
		{
			bb[i]=fastpow(a,solve(b,bb[i],phi[p]),p);
		}
	}
//	for(i=1;i<=n;i++)
//	{
//		printf("%lld %lld\n",aa[i],bb[i]);
//	}
	for(i=1;i<=n;i++)//a数组用1表示结尾,b数组用0表示结尾。之后分6种情况去判断就行了
	{
        for(j=1;j<=n;j++)
		{
            dp[0][i&1][j]=dp[1][i&1][j]=0;
            dp[0][i&1][j]=dp[1][i&1][j]=0;
            if(bb[j]==bb[j-1])
			{
                dp[0][i&1][j]=max(dp[0][i&1][j],dp[0][i&1][(j-1)]+bb[j]);
            }
            else
			{
                dp[0][i&1][j]=max(dp[0][i&1][j],dp[0][i&1][(j-1)]);
            }
            if(aa[i]==aa[i-1])
			{
                dp[1][i&1][j]=max(dp[1][i&1][j],dp[1][(i-1)&1][j]+aa[i]);
            }
            else
			{
                dp[1][i&1][j]=max(dp[1][i&1][j],dp[1][(i-1)&1][j]);
            }
            if(bb[j]==aa[i])
			{
                dp[0][i&1][j]=max(dp[0][i&1][j],dp[1][i&1][(j-1)]+bb[j]);
                dp[1][i&1][j]=max(dp[1][i&1][j],dp[0][(i-1)&1][j]+aa[i]);
            }
            else
			{
                dp[0][i&1][j]=max(dp[0][i&1][j],dp[1][i&1][(j-1)]);
                dp[1][i&1][j]=max(dp[1][i&1][j],dp[0][(i-1)&1][j]);
            }
        }
    }
    printf("%lld",max(dp[0][n&1][n],dp[1][n&1][n]));
	return 0;
}

 

게시 56 개 원래 기사 · 원 찬양 17 · 전망 2320

추천

출처blog.csdn.net/weixin_43958964/article/details/102303801