首页 > 其他分享 >JSOI2017 代码

JSOI2017 代码

时间:2024-07-03 22:19:43浏览次数:21  
标签:10 ll JSOI2017 int 代码 sum rightarrow

\(\text{JSOI2017 day1t1 代码}\)

题解

设\(d_i\)表示长度为\(i\)的库函数数量,\(h_i\)表示长度为\(i\)的可编译代码的数量,\(f_{i,j}\)表示寄存器初始值为\(j\)、终值为\(0\)的代码数量,\(F_{i,j}\)表示寄存器初值为\(0\)、终值为\(j\)的代码数量,\(g_{i,j}\)表示长度为\(i\)可以加上\(j\)的一个真约数、不包含括号的代码数量
\(d,h,g\)易求,考虑\(f,F\)怎样转移
对于\(f\),首先有一个最简单的转移,在开头加上\(+\)或\(-\)

\[f_{i-1,j-1}+f_{i-1,j+1}\rightarrow f_{i,j} \]

在开头加上库函数

\[\sum_{k=2}^{i}f_{i-k,j}d_k\rightarrow f_{i,j} \]

在开头加上括号
若\(j=0\),括号中可以是任何可编译代码

\[\sum_{k=2}^{i}f_{i-k,j}h_{k-2}\rightarrow f_{i,j} \]

若\(j\not =0\),括号中代码需要再一次或若干次执行后将\(j\)变为\(0\)

\[\sum_{k=2}^{i}f_{i-k,j}(g_{k-2,j}+f_{k-2,j})\rightarrow f_{i,j} \]

这里也可以意识到前面将\(g\)定义为真约数是为了避免算重
\(F\)的转移类似,不过由于定义不同,考虑在结尾加东西

\[F_{i-1,j-1}+F_{i-1,j+1}\rightarrow F_{i,j} \]

\[\sum_{k=2}^{i}F_{i-k,j}d_k\rightarrow F_{i,j} \]

若\(j=0\),考虑在结尾加括号

\[\sum_{k=2}^i[F_{i-k,0}h_{k-2}+\sum_{w\not =0}F_{i-k,w}(g_{k-2,w}+f_{k-2,w})]\rightarrow F_{i,j} \]

答案即为\(\sum_{i}F_{n,i}\)

\(\text{code}\)

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int N=3e2+10,C=1e2+50;
const ll mod=1e9+7;
int n,k,d[N+10];
ll h[N+10],g[N+10][N+10],f[N+10][N+10],F[N+10][N+10];
void Add(ll &a,ll b){a+=b,a%=mod;}
int main()
{
	freopen("code.in","r",stdin);
	freopen("code.out","w",stdout);
	scanf("%d %d",&n,&k);
	for(int i=1,l=1;l<=k;i++,l=l*10) d[i+1]=min(9*l,k-l+1);
//	for(int i=1;i<=n;i++) printf("%d ",d[i]);puts("");
	h[0]=1;
	for(int i=1;i<=n;i++)
	{
		h[i]=h[i-1]*2%mod;
		for(int j=2;j<=i;j++)
			Add(h[i],h[i-j]*h[j-2]%mod),
			Add(h[i],h[i-j]*d[j]%mod);
	}
//	for(int i=1;i<=n;i++) printf("%lld ",h[i]);puts("");
	g[0][0+C]=1;
	for(int i=1;i<=n;i++)
		for(int j=-n+C;j<=n+C;j++)
		{
			g[i][j]=g[i-1][j-1]+g[i-1][j+1],g[i][j]%=mod;
			for(int k=2;k<=i;k++)
				Add(g[i][j],g[i-k][j]*d[k]%mod);
		}
//	printf("%lld\n",g[3][3+C]);
//	return 0;
	for(int i=1;i<=n;i++)
	{
		for(int j=-n;j<0;j++)
		{
			for(int k=2;-n<=j*k;k++)
				Add(g[i][j*k+C],g[i][j+C]);
			g[i][j+C]=0;
		}
		for(int j=n;j>0;j--)
		{
			for(int k=2;j*k<=n;k++)
				Add(g[i][j*k+C],g[i][j+C]);
			g[i][j+C]=0;
		}
	}
//	printf("%lld\n",g[3][3+C]);
//	return 0;
	f[0][0+C]=1;
	for(int i=1;i<=n;i++)
		for(int j=-n+C;j<=n+C;j++)
		{
			Add(f[i][j],f[i-1][j-1]);
			Add(f[i][j],f[i-1][j+1]);
			for(int k=2;k<=i;k++) Add(f[i][j],f[i-k][j]*d[k]%mod);
			if(j==C)
			{
				for(int k=2;k<=i;k++)
					Add(f[i][j],f[i-k][j]*h[k-2]%mod);
			}
			else
			{
				for(int k=2;k<=i;k++)
					Add(f[i][j],f[i-k][C]*f[k-2][j]%mod),
					Add(f[i][j],f[i-k][C]*g[k-2][j]%mod);
			}
		}
//	printf("%lld\n",f[3][0+C]);
//	return 0;
	F[0][0+C]=1;
	for(int i=1;i<=n;i++)
		for(int j=-n+C;j<=n+C;j++)
		{
			Add(F[i][j],F[i-1][j-1]);
			Add(F[i][j],F[i-1][j+1]);
			for(int k=2;k<=i;k++) Add(F[i][j],F[i-k][j]*d[k]%mod);
			if(j==C)
			{
				for(int k=2;k<=i;k++)
				{
					Add(F[i][j],F[i-k][j]*h[k-2]%mod);
					for(int w=-n+C;w<=n+C;w++)
						if(w!=C)
							Add(F[i][j],F[i-k][w]*g[k-2][w]%mod),
							Add(F[i][j],F[i-k][w]*f[k-2][w]%mod);
				}
			}
		}
//	printf("%lld %lld %lld %lld\n",F[3][0+C],F[3][1+C],F[3][2+C],F[3][3+C]);
	ll ans=0;
	for(int i=-n+C;i<=n+C;i++) Add(ans,F[n][i]);
	printf("%lld\n",ans);
	return 0;
}

标签:10,ll,JSOI2017,int,代码,sum,rightarrow
From: https://www.cnblogs.com/the-blog-of-doctorZ/p/18282632

相关文章

  • 代码随想录算法训练营第四十八天 | 188.买卖股票的最佳时机IV 309.买卖股票的最佳时
    188.买卖股票的最佳时机IV题目链接文章讲解视频讲解动规五部曲:dp数组的含义:dp[j][2*i-1]表示第i次持有股票dp[j][2*i]表示第i次不持有股票递推公式:dp[j][2i-1]=max(dp[j-1][2i-1],dp[j-1][2*i-2]-prices[j]);dp[j][2i]=max(dp[j-1][2i],dp[j-1][2*i-1]......
  • 代码随想录第四十六天 | 322. 零钱兑换,279.完全平方数,139.单词拆分
    322.零钱兑换看完想法:此处是求最小值,所以递推公式中含Min,即dp[j]=min(d[[j],dp[j-coins[i]]+1),初始化都为INT_MAX,且dp[0] =0。由于不是求组合数,所以物品和背包重量的遍历先后顺序都是可以的。此处要注意一个细节,如果是物品for外循环,背包从coins[j]开始并且j++,(之......
  • Python学习笔记27:进阶篇(十六)常见标准库使用之质量控制中的代码质量与风格第一部分
    前言本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。根据模块知识,一次讲解单个或者多个模块的内容。教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html质量控制质量控制(QualityControl,QC),主要关注于提高......
  • 编译原理 第六章&编译原理必考大题: 语义分析及中间代码生成&必考大题语句翻译
    第六章语义分析及中间代码生成&必考大题语句翻译文章目录第六章语义分析及中间代码生成&必考大题语句翻译写在最前6.1语义分析6.2中间代码6.2.1逆波兰式6.2.2四元式6.2.3三元式6.3语句翻译(必考大题)6.3.1布尔表达式的翻译6.3.2if语句的翻译6.3.3while语句翻......
  • 代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素
    704.二分查找这个之前有写过,最重要的就是把握住要去搜索的区间的形式,包括左闭右闭以及左闭右开两种classSolution{publicintsearch(int[]nums,inttarget){intleft=0,right=nums.length;while(left<right){//左闭右开的版本,结果存储......
  • 手把手教你如何用python写一个经典小游戏(仅需100行以内的代码)
    创作灵感小时候也就是大概十几年前的时候,智能触屏手机还未大量普及,移动网络还是2G,大部分人用的都是小灵通,里面只有几款经典的游戏,比如俄罗斯方块,贪吃蛇等。还记得以前自己玩的不亦乐乎。如今网络发展迅速,通讯设备越来越智能化,集成化,这些上世纪的经典游戏似乎早已淡忘人们的视......
  • 代码训练营 DAY4打卡
      本文由GarfieldTheOldCat原创,转载请标明dekkyandlappy-CSDN博客今天学习了链表的第二课时,链表基础内容在代码训练营DAY3打卡 本文由GarfieldTheOldCat原创,转载请标明两两交换链表中的节点这道题目的第一个难点在于对题目意思的理解,什么是两两交换?举个例子:【A,B,C,D】......
  • Gitlab代码管理工具安装配置
    前言:没有真正的证书与域名建议使用http+ip的方式在内网使用,不建议使用假的域名地址一、安装前配置#更改主机域名hostnamectlset-hostnamegitlab.dome.combash#配置hosts底部添加下面内容vim/etc/hosts############################ipgitlab.dome.com########......
  • 代码3:构造最小的HelloWorld程序
    Intro:绪论2:应用视角的操作系统。目的:通过精简程序,了解整个编译过程。一、GCC编译hello.c的全过程.c(源代码)->.i(预编译源代码)-gcc->.S(汇编代码)-as->.o-ld->a.out(一)GCC编译hello.c中只有一行printf("hello,world\n");指令(return由编译器处理,代码......
  • 源代码保密需要关注哪些重点?6种方法教会你
    源代码保密是信息安全管理中的一个重要环节,尤其在研发环境中,源代码的泄露可能导致严重的商业和安全风险。以下是源代码防泄密的重点和方法:1. 物理隔离与网络隔离物理隔离:通过将开发环境与外部网络物理隔离,防止未经授权的访问。例如,使用专用的开发网络,禁止外部设备(如U盘、移......