洛谷 P4882 lty loves 96! 解题报告
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! 解题报告的更多相关文章
- 洛谷_Cx的故事_解题报告_第四题70
		
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
 - 洛谷  P2317 [HNOI2005]星际贸易 解题报告
		
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
 - 洛谷 P3802 小魔女帕琪 解题报告
		
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
 - 洛谷 P2606 [ZJOI2010]排列计数  解题报告
		
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
 - 洛谷1303 A*B Problem 解题报告
		
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
 - 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告
		
[USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...
 - 洛谷 P1379 八数码难题 解题报告
		
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
 - 「洛谷P1198」 [JSOI2008]最大数 解题报告
		
P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: ...
 - NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告
		
前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...
 
随机推荐
- Python的静态方法和类方法
			
Python中使用@staticmethod这个装饰器让方法变为静态方法 一:定义 @staticmethod: 首先它是一个装饰器,被装饰的方法不需要隐含的参数,对象和对象的实例都可以调用静态方法 ...
 - MySQL如何计算重要的指标,来确定配置是否正确
			
在调优MySQL数据库和监控数据库时,很多朋友不知道如何下手,怎么来确定是不是参数设置的合理,下面给出一些如何计算指标,来确定数据库参数是否设置合理,希望给大家一些方法,去做MySQL数据库优化,最好 ...
 - redis源代码结构解析
			
看了黄建宏老师的<Redis设计与实现>,对redis的部分实现有了一个简明的认识: 之前面试的时候被问到了这部分的内容,没有关注,好在还有时间,就把Redis的源码看了一遍. Redis ...
 - Laravel系列 Web
			
一.Homestead准备 上一篇文章已经对它的配置进行了说明,下面对Homestead.yaml进行说明 --- ip: "192.168.10.10" memory: 2048 ...
 - 浏览器进程/线程模型及JS运行机制
			
浏览器是多进程的,有一个主控进程,以及每一个tab页面都会新开一个进程(某些情况下多个tab会合并进程). 进程可能包括主控进程,插件进程,GPU,tab页(浏览器内核)等等. Browser进程:浏 ...
 - saltstack plug in
			
目录 可插拔的子系统 灵活性 虚拟模块 salt的核心架构提供了一种高速的交流总线,在核心架构的上层,salt暴露出来的特征是:松散耦合,可插拔的子系统. 可插拔的子系统 salt包含20中插件系统, ...
 - Centos7 grep命令简介
			
grep 是一个最初用于 Unix 操作系统的命令行工具.在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本. grep 可根据提供的 ...
 - python lamba表达式
			
lambda函数也叫匿名函数,即,函数没有具体的名称. g=lambda x:x**2 def f(x): return x**2 lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边是 ...
 - myeclipse中项目名有红叉,但项目中文件没有报错的解决办法
			
导入了别人的项目,各种jar包都放好后,path也都build好了,项目也能正常启动,但是就是项目名有红叉,这是为什么呢? 网上有人说Java build path中的jar包missing了,这是一 ...
 - laravel5.5任务调度
			
目录 1. 定义调度 1.1 使用Closure 1.2 Artisan 命令调度 1.3 队列任务调度 1.4 Shell 命令调度 1.5 调度频率设置 1.6 闭包测试限制 1.7 避免任务重复 ...