zoukankan      html  css  js  c++  java
  • The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest C. Xyjj’s sequence(动态规划+欧拉降幂)

    题目链接:https://nanti.jisuanke.com/t/40255

    中文题面:

    解题思路:先用欧拉降幂求出A,B两个序列,定义dp【0】【i】【j】为取A的前i个元素,B的前j个元素,且C的最后一个元素为B【j】,同理dp【1】【i】【j】为取A的前i个元素,B的前j个元素,且C的最后一个元素为A【i】,那么就很容易得到状态转移方程。那么最后答案即为max(dp【0】【n】【n】,dp【1】【n】【n】)。还有值得注意的是:该题需要使用滚动数组,不然会超内存。

    在此贴两个关于欧拉降幂的链接吧:https://blog.csdn.net/qq_37632935/article/details/81264965

    https://blog.csdn.net/u013534123/article/details/78912721

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll mod=100003;
    const int maxn=5003;
    int v1[maxn],v2[maxn];
    ll a1[maxn],b1[maxn]; 
    ll dp[2][3][maxn];
    ll Mod(ll n,ll m){
    	return n<m?n:(n%m+m);
    }
    ll ph(ll n){
    	ll ans=n;
    	ll res=n;
    	for(int i=2;i*i<=res;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;
    }
    ll qpow(ll n,ll m,ll mo){
    //	cout<<"YES
    ";
    	ll ans=1;
    	while(m){
    		if(m&1)ans=ans*n%mo;
    		m/=2;
    		n=n*n%mo;
    	}
    	return ans;
    }
    ll solve(int num,ll mo,ll tt){
    	if(num==1||mo==1)return Mod(tt,mo);
    	return qpow(tt,solve(num-1,ph(mo),tt)+ph(mo),mo);
    }
    int main(){
    	ll a,b;
    	scanf("%lld%lld",&a,&b);
    	int n;
    	scanf("%d",&n);
    	for(int i=0;i<n;i++){
    		scanf("%d",&v1[i]);
    	}
    	for(int i=0;i<n;i++){
    		scanf("%d",&v2[i]);
    	}
    	for(int i=0;i<n;i++){
    		a1[i+1]=qpow(a,solve(v1[i],mod-1,b)+mod-1,mod);
    	}
    	for(int i=0;i<n;i++){
    		b1[i+1]=qpow(a,solve(v2[i],mod-1,b)+mod-1,mod);
    	}
    	for(int i=1;i<=n;i++){//1
    		for(int j=1;j<=n;j++){//0
    			dp[0][i&1][j]=dp[1][i&1][j]=0;
    			if(b1[j]==a1[i]){
    				dp[0][i&1][j]=max(dp[0][i&1][j],dp[1][i&1][(j-1)]+b1[j]);
    				dp[1][i&1][j]=max(dp[1][i&1][j],dp[0][(i-1)&1][j]+a1[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]);
    			} 
    			if(b1[j]==b1[j-1]){
    				dp[0][i&1][j]=max(dp[0][i&1][j],dp[0][i&1][(j-1)]+b1[j]);
    			}
    			else{
    				dp[0][i&1][j]=max(dp[0][i&1][j],dp[0][i&1][(j-1)]);
    			}
    			if(a1[i]==a1[i-1]){
    				dp[1][i&1][j]=max(dp[1][i&1][j],dp[1][(i-1)&1][j]+a1[i]);
    			}
    			else{
    				dp[1][i&1][j]=max(dp[1][i&1][j],dp[1][(i-1)&1][j]);
    			}
    	//		cout<<i<<" "<<j<<" "<<dp[0][i&1][j]<<" "<<dp[1][i&1][j]<<endl; 
    		} 
    	}
    	cout<<max(dp[0][n&1][n],dp[1][n&1][n])<<endl;
    	return 0;
    }
    

      

  • 相关阅读:
    Kotlin技术入门以及和Java对比.md
    最新版Charles破解方法(Mac+Windows).md
    阿里移动云专场专题.md
    win10下 github+hexo搭建个人博客.md
    Java内存回收机制.md
    基于补偿的数据库分布式事务实践
    Log4J,在踩坑中升级版本
    关于服务注册与发现
    JVM内存模型-重排序&内存屏障
    GC初识
  • 原文地址:https://www.cnblogs.com/Zhi-71/p/11618661.html
Copyright © 2011-2022 走看看