P4882 lty loves 96!

题目背景

众所周知,\(lty\)非常喜欢\(96\)这两个数字(想歪的现在马上面壁去),更甚于复读(人本复)!

题目描述

由于爱屋及乌,因此,\(lty\)对于那些含有\(96\)的数也非常喜欢,而这里的含有不是一般的含有,而是具有以下性质的含有(三条都需要满足):

这个数为一个\(N\)位数,且没有前置零

这个数中至少要出现\(M\)次\(9\)和\(6\)(例:\(986996\)中出现了\(5\)次,\(9\)出现了\(3\)次,\(6\)出现了\(2\)次,共计\(5\)次)

这个数存在任意连续的从高到低三位\(A,B,C\),满足下面任意一条

\(A+B+C\)为\(9\)或\(6\)

\((A^2+B^2)\%C\)为\(9\)或\(6\),如果\(C\)为\(0\),则该条件视为不满足

输入输出格式

输入格式:

一行,两个数\(N\),\(M\)

输出格式:

一个数,表示这样的数的个数

说明

对于10%的数据,\(N<=6\)

对于40%的数据,\(N<=18\)

对于100%的数据,\(N<=50,0<=M<=N\)


人生第一道数位DP

\(dp_{i,j,k,l,q}\)从高到低前\(i\)位第\(i\)位为\(j\),第\(i-1\)位为\(k\),一共有\(l\)个\(6\)或\(9\),是否已经满足条件的方案数

注意前导0,注意要压位高精。


Code:

#include <cstdio>
#include <cstring>
int max(int x,int y){return x>y?x:y;}
struct node
{
int num[20];
node()
{
memset(num,0,sizeof(num));
num[0]=1;
}
node(int i)
{
memset(num,0,sizeof(num));
num[0]=1,num[1]=i;
}
node friend operator +(node n1,node n2)
{
int len=max(n1.num[0],n2.num[0]);
node n3;
n3.num[0]=len;
for(int i=1;i<=len;i++)
{
n3.num[i]+=n1.num[i]+n2.num[i];
n3.num[i+1]=n3.num[i]/10000;
n3.num[i]%=10000;
}
if(n3.num[len+1]) ++n3.num[0];
return n3;
}
}dp[51][10][10][51][2];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<=9;i++)
for(int j=1;j<=9;j++)
{
if((i==6||i==9)&&(j==6||j==9))
dp[2][i][j][2][0]=node(1);
else if(i==6||i==9)
dp[2][i][j][1][0]=node(1);
else if(j==6||j==9)
dp[2][i][j][1][0]=node(1);
else
dp[2][i][j][0][0]=node(1);
}
for(int i=3;i<=n;i++)
for(int l3=0;l3<=9;l3++)
for(int l2=0;l2<=9;l2++)
for(int l1=0;l1<=9;l1++)
{
int s1=l1+l2+l3,s2=l1?(l3*l3+l2*l2)%l1:0;
for(int j=0;j<=i;j++)
{
if(s1==6||s1==9||s2==6||s2==9)
{
if(l1==6||l1==9)
{
if(!j) continue;
dp[i][l1][l2][j][1]=dp[i][l1][l2][j][1]
+dp[i-1][l2][l3][j-1][1]
+dp[i-1][l2][l3][j-1][0];
}
else
{
dp[i][l1][l2][j][1]=dp[i][l1][l2][j][1]
+dp[i-1][l2][l3][j][1]
+dp[i-1][l2][l3][j][0];
}
}
else
{
if(l1==6||l1==9)
{
if(!j) continue;
dp[i][l1][l2][j][0]=dp[i][l1][l2][j][0]
+dp[i-1][l2][l3][j-1][0];
dp[i][l1][l2][j][1]=dp[i][l1][l2][j][1]
+dp[i-1][l2][l3][j-1][1];
}
else
{
dp[i][l1][l2][j][0]=dp[i][l1][l2][j][0]
+dp[i-1][l2][l3][j][0];
dp[i][l1][l2][j][1]=dp[i][l1][l2][j][1]
+dp[i-1][l2][l3][j][1];
}
} }
}
node ans=node(0);
for(int i=0;i<=9;i++)
for(int j=0;j<=9;j++)
for(int l=m;l<=n;l++)
ans=ans+dp[n][i][j][l][1];
printf("%d",ans.num[ans.num[0]]);
for(int i=ans.num[0]-1;i;i--)
{
if(ans.num[i]<1000) printf("0");
if(ans.num[i]<100) printf("0");
if(ans.num[i]<10) printf("0");
printf("%d",ans.num[i]);
}
return 0;
}

2018.9.9

洛谷 P4882 lty loves 96! 解题报告的更多相关文章

  1. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  2. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  3. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  4. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  5. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  6. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

  7. 洛谷 P1379 八数码难题 解题报告

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

  8. 「洛谷P1198」 [JSOI2008]最大数 解题报告

    P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: ...

  9. NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告

    前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...

随机推荐

  1. 图解HTTP-1.web和网络基础

    目录 1. 3 项 WWW 构建技术 2. TCP/IP 是互联网相关的各类协议族的总称 协议(protocol) TCP/IP分层管理 TCP/IP通信传输流 封装(encapsulate) 3. ...

  2. MySQL - Linux下安装

    本安装方式仅对5.7.21版本负责. 下载地址:wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.21-linux-glibc2 ...

  3. ethereum(以太坊)(三)--合约单继承与多继承

    pragma solidity ^0.4.0; // priveta public internal contract Test{ //defualt internal uint8 internal ...

  4. php-5.6.26源代码 - 扩展模块的种类,扩展模块的执行埋点

    模块种类(两种) 类型一:zend的模块:(类似zend_extension=test.so) 识别方法: php.ini中以zend_extension开头的配置,如zend_extension=t ...

  5. Delphi7卸载indy9,安装indy10步骤

    1. 找到C:\Program Files\Borland\Delphi7\Borland Delphi7.msi——双击——点Next——选择Modify,点Next——找到Program File ...

  6. php扩展开发-INI配置

    php.ini文件是用来保存各项扩展配置的文件,每个扩展都或多或少需要有一个定制化的配置,ini文件是一个很好的保存配置的方式,我们来看下怎么在自己的扩展里,使用到ini的配置功能 //创建ini的配 ...

  7. Linux相关常用命令

    1.XShell中上传文件命令 首先需要安装rz文件上传工具: yum -y install lrzsz 然后执行以下命令,可打开本地系统的选择文件窗口:(或者直接把本地的文件拖动到SSH Shell ...

  8. Can't connect to local MySQL server through socket '/tmp/mysql.sock'

    今天在连接mysql的时候出现了上面的错误, 很明显原因找不到/socket 文件 查了半天才发现原来是mysql没有开启 service  mysqld  start 开启之后在/tmp/目录下回自 ...

  9. 04,Python网络爬虫之requests模块(1)

    引入 Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用. 警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症.冗余代码症.重新发明轮子症.啃文档 ...

  10. AD高级规则设置

    inpolygon 是所有的覆铜 ispad 是焊盘到焊盘的间距 IsVia 过孔间距 ispad and InComponent('S1')    设置某个器件的焊盘间距规则 ispad and H ...