前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝桥杯官网 试题 PREV-253 历届真题 质数行者【第十一届】【决赛】【研究生组】【C++】【Java】两种解法

蓝桥杯官网 试题 PREV-253 历届真题 质数行者【第十一届】【决赛】【研究生组】【C++】【Java】两种解法

作者头像
红目香薰
发布2022-11-30 17:02:07
3270
发布2022-11-30 17:02:07
举报
文章被收录于专栏:CSDNToQQCode

为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来。希望能对大家的成绩有所帮助。

今年的最大目标就是能为【一亿技术人】创造更高的价值。


资源限制

内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s

C++

代码语言:javascript
复制
#include<cstdio>
#include<cstring>
int p[200],pp=1,upper;
long long C[1500][500],dp[1000][500],dp2[1000];
const long long mod=1000000007;
void makeC()
{
	int i,j;
	for(i=0;i<1500;i++)
		C[i][0]=1;
	for(i=1;i<1500;i++)
		for(j=1;j<500;j++)
			C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
void makeP()
{
	int i,j;
	p[0]=2;
	for(i=3;i<1000;i+=2)
	{
		for(j=3;j*j<=i;j+=2)
			if(i%j==0)break;
		if(j*j>i)p[pp++]=i;
	}
}
long long calc(int r,int c,int w)
{
	int i,j,k,upr=r/2,upc=c/2,upw=w/2;
	long long ans=0;
	memset(dp2,0,sizeof(dp2));
	for(i=0;i<=upr;i++)
		for(j=0;j<=upc;j++)
			dp2[i+j]=(dp2[i+j]+dp[r][i]*dp[c][j]%mod*C[i+j][i]%mod)%mod;
	for(i=0;i<=upr+upc;i++)
		for(k=0;k<=upw;k++)
			ans=(ans+dp2[i]*dp[w][k]%mod*C[i+k][k]%mod)%mod;
	return ans;
}
void makeDP()
{
	int i,j,k;
	dp[0][0]=1;
	for(i=2;i<=upper;i++)
	{
		for(j=0;j<pp;j++)
			if(p[j]>i)break;
			else
			{
				for(k=1;k<=i/2;k++)
					dp[i][k]=(dp[i][k]+dp[i-p[j]][k-1])%mod;
			}
	}
}
int main()
{
	int i,j,k,r1,c1,w1,r2,c2,w2,r,c,w;
	long long ans;
	makeC();makeP();
	scanf("%d%d%d",&r,&c,&w);
	r--;c--;w--;
	scanf("%d%d%d%d%d%d",&r1,&c1,&w1,&r2,&c2,&w2);
	r1--,c1--,w1--,r2--,c2--,w2--;
	upper=r>c?r:c;
	upper=upper>w?upper:w;
	makeDP();
	ans=calc(r,c,w)%mod;
	ans-=calc(r1,c1,w1)*calc(r-r1,c-c1,w-w1)%mod;
	ans-=calc(r2,c2,w2)*calc(r-r2,c-c2,w-w2)%mod;
	if(r1>=r2&&c1>=c2&&w1>=w2)
		ans+=calc(r2,c2,w2)*calc(r1-r2,c1-c2,w1-w2)%mod*calc(r-r1,c-c1,w-w1)%mod;
	else if(r1<=r2&&c1<=c2&&w1<=w2)
		ans+=calc(r1,c1,w1)*calc(r2-r1,c2-c1,w2-w1)%mod*calc(r-r2,c-c2,w-w2)%mod;
	printf("%lld\n",(ans%mod+mod)%mod);
	return 0;
}

Java

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
	public boolean bushu(int a, List<Integer> list) {
		boolean q = true;
		if (!list.contains(a)) {
			for (int i = 0; i < list.size(); i++) {
				int b = list.get(i);
				if (a % b == 0) {
					q = false;
					break;
				}
			}
		}
		if (q) {
			list.add(a);
		}
		return q;
	}
	public long niyuan(long a, long x,long mod)     //这里边做快速幂边取模
	{
		long ans = 1;
		while(x>0) 
		{
			if((x&1)!=0) 
				ans = (ans * a) %mod;
			a = (a * a) %mod;
			x >>= 1;
		}
		return ans;
	}
	public long all(int x,int y,int z,long[][] dp,long mod,long jiechen[],long niyuan[]) {
		long[] tmp=new long[x+y+z+1];
		long all=0;
		for(int i=1;i<=x;i++) {
			for(int j=1;j<=y;j++) {
				long bs=dp[x][i]*dp[y][j]%mod*jiechen[i+j]%mod*niyuan[i]%mod*niyuan[j]%mod;
				if(bs!=0) {
					tmp[i+j]=(tmp[i+j]+bs)%mod;
					all=all+tmp[i+j];
				}
			}
		}
		long ans=0;
		for(int i=0;i<=z;i++) {
			for(int j=0;j<=x+y;j++) {
				ans=ans+dp[z][i]*tmp[j]%mod*jiechen[i+j]%mod*niyuan[i]%mod*niyuan[j]%mod;
				ans=ans%mod;
			}
		}
		return ans;
	}
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		long[][] dp;
		int xj[][]= new int[2][3];
		int zhishu[]=new int[169];
		long mod=1000000007;
		List<Integer> list = new ArrayList<Integer>();
		Main s=new Main();
		int i1=1;
		for (int i = 2; i < 1000; i++) {
			if (s.bushu(i, list)) {
				zhishu[i1++] = i;
			}
		}
		Scanner in = new Scanner(System.in);
		int x,y,z;
		x = in.nextInt();
		y = in.nextInt();
		z = in.nextInt();
		for (int i = 0; i < 2; i++) {
			for (int j = 0; j < 3; j++) {
				xj[i][j] = in.nextInt();
			}
		}
		int max=Math.max(x,Math.max(y, z));
		long[] jiechen=new long[max*3+1];
		long[] niyuan=new long[max*3+1];
		jiechen[1]=1;
		jiechen[0]=1;
		niyuan[1]=1;
		niyuan[0]=1;
		for(int i=2;i<max*3+1;i++) {
				jiechen[i]=(jiechen[i-1]*i)%mod;
		}
		for(int i=2;i<max*3+1;i++) {
			niyuan[i]=s.niyuan(jiechen[i],mod-2, mod);
		}
		dp=new long[max+1][max+1];
		dp[1][0]=1;
		for(int i=3;i<=max;i++) {
			for(int j=1;j<=i;j++) {
				for(int k=1;k<=168&&zhishu[k]<i;k++) {
					dp[i][j]=(dp[i][j]+dp[i-zhishu[k]][j-1])%mod;
				}
			}
		}
		long ans=s.all(x, y, z, dp, mod, jiechen,niyuan);
		ans=(ans-s.all(xj[0][0],xj[0][1],xj[0][2],dp, mod, jiechen,niyuan)*s.all(x-xj[0][0]+1, y-xj[0][1]+1, z-xj[0][2]+1, dp, mod, jiechen,niyuan)%mod+mod)%mod;
		ans=(ans-s.all(xj[1][0],xj[1][1],xj[1][2],dp, mod, jiechen,niyuan)*s.all(x-xj[1][0]+1, y-xj[1][1]+1, z-xj[1][2]+1, dp, mod, jiechen,niyuan)%mod+mod)%mod;
		if(xj[0][0]<=xj[1][0]&&xj[0][1]<=xj[1][1]&&xj[0][2]<=xj[1][2]) {
			ans=(ans+s.all(xj[0][0], xj[0][1],xj[0][2], dp, mod, jiechen,niyuan)*s.all(xj[1][0]-xj[0][0]+1, xj[1][1]-xj[0][1]+1,xj[1][2]-xj[0][2]+1, dp, mod, jiechen,niyuan)%mod*s.all(x-xj[1][0]+1, y-xj[1][1]+1,z-xj[1][2]+1, dp, mod, jiechen,niyuan)%mod)%mod;
		}
		if(xj[0][0]>=xj[1][0]&&xj[0][1]>=xj[1][1]&&xj[0][2]>=xj[1][2]) {
			ans=(ans+s.all(xj[1][0], xj[1][1],xj[1][2], dp, mod, jiechen,niyuan)*s.all(xj[0][0]-xj[1][0]+1, xj[0][1]-xj[1][1]+1,xj[0][2]-xj[1][2]+1, dp, mod, jiechen,niyuan)%mod*s.all(x-xj[0][0]+1, y-xj[0][1]+1,z-xj[0][2]+1, dp, mod, jiechen,niyuan)%mod)%mod;
		}
		System.out.println(ans);
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++
  • Java
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档