脑子一热报了CCF的软测。。但是又觉得好像并没有什么卵用,就当为蓝桥杯预热然后顺便去软件学院玩一玩吧,遇到一个有意思的题:

time limits : 1s

问题描述
  我们把一个数称为有趣的,当且仅当:
  1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次。
  2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。
  3. 最高位数字不为0。
  因此,符合我们定义的最小的有趣的数是2013。除此以外,4位的有趣的数还有两个:2031和2301。
  请计算恰好有n位的有趣的数的个数。由于答案可能非常大,只需要输出答案除以1000000007的余数。
输入格式
  输入只有一行,包括恰好一个正整数n (4 ≤ n ≤ 1000)。
输出格式
  输出只有一行,包括恰好n 位的整数中有趣的数的个数除以1000000007的余数。
样例输入
4
样例输出
3
数位统计问题。。臣妾真的做不到啊。。把网上的两种方法在这里总结一下下。
方法一:数位DP
容易得到(我他妈怎么没想到),每一个n位有趣的数,都是从n-1位的某个数转移过来的(n-1位可能不是有趣的数),那麽可以根据组成数字的元素,把数字分成这这么6种数字:
0:{2}---只含有2,很显然开头有趣的数的第一个数字肯定是2,类似2222;
1:{2,0}
2:{2,1}
3:{2,1,0}
4:{2,1,3}
5:全部4种数字
定义状态d【n】【6】;d【i】【j】表示i位数,状态为j的种类数;
转移很简单,d【i】【0】 = 1(只有2组成);
d【i】【1】 = (d[i-1][0] + d[i-1][1]*2)%mod;(可以在n-1位只含2的数后面加一位0,或在n-1位含有2,0的数后面加个0或2,以下都可以很轻松地推出,注意0在1前面,2在3前面)

d[i][2] = (d[i-1][0] + d[i-1][2])%mod;
d[i][3] = (d[i-1][1] + d[i-1][3]*2 )%mod;
d[i][4] = (d[i-1][2] + d[i-1][1] + d[i-1][4]*2)%mod;
d[i][5] = (d[i-1][3] + d[i-1][4] + d[i-1][5]*2)%mod;

另外注意会爆int

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = + ;
const int mod = ;
int n;
ll d[maxn][];
int main()
{
for(int i = ; i <= ; ++i)
{
d[i][] = ;
d[i][] = (d[i-][] + d[i-][]*)%mod;
d[i][] = (d[i-][] + d[i-][])%mod;
d[i][] = (d[i-][] + d[i-][]* )%mod;
d[i][] = (d[i-][] + d[i-][] + d[i-][]*)%mod;
d[i][] = (d[i-][] + d[i-][] + d[i-][]*)%mod;
}
scanf("%d",&n);
printf("%lld\n",d[n][]);
}

方法二:推公式

能不能不递推,直接o(1)地算出答案呢?当然可以!

已知0,1,2,3都必须出现一次,那么我们可以枚举0,1出现的次数,或者说占用的位数;

0,1加在一起至少出现占2位,最多占n-2位,假设为i位,则首位为2,还剩n-1位,从n-1位里面挑i位分给0,1,有Cn-1,i种方案,然后0,1内部有i-1种排列方式,2,3内部有

n-i-1种反案,所以最后答案:

然而这种方法要o(n^2)利用杨辉三角预处理组合数,最后时间和第一种方法跑起来差不多。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = + ;
const int mod = ;
int n;
ll c[maxn][maxn];
ll sum;
int main()
{
for(int i = ; i <= ; ++i)
{
c[i][] = ;
for(int j = ; j < i; ++j)
{
c[i][j] = (c[i-][j-] + c[i-][j])%mod;
}
c[i][i] = ;
}
scanf("%d",&n);
for(int i = ; i <= n-; ++i)
{
sum = (sum + c[n-][i]%mod*(i-)*(n-i-))%mod;
}
printf("%lld\n",sum);
}

方法三:矩阵,递推。。。待补充

CCF软考---《有趣的数》的更多相关文章

  1. CCF CSP 201312-4 有趣的数

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-4 有趣的数 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0 ...

  2. CCF系列之有趣的数(201312-4)

    题目链接: http://115.28.138.223:81/view.page?opid=4 试题名称: 有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个 ...

  3. CCF模拟题 有趣的数

    有趣的数 时间限制: 1.0s 内存限制: 256.0MB   问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都 ...

  4. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  5. ccf 201312-04 有趣的数(组合数学)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  6. CCF 201312-4 有趣的数[dp][难]

    问题描述 试题编号: 201312-4 试题名称: 有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, ...

  7. 软考类----编码、ASII码等

    淘米2014实习生笔试,今年是淘米第一年招暑期实习生,笔试好大部分考的是软考的题目啊啊啊啊(劳资后悔当年没考软考刷加权),其他是浅而泛的风格,C++,SQL语句,数据结构(哈夫曼树,二叉查找树,栈后缀 ...

  8. 软考计算机网络原理之IP计算问题汇总

    转自 http://www.cnblogs.com/jyh317/archive/2013/04/14/3018650.html 1.IP地址 分类: ①A类IP地址 ②B类IP地址 ③C类IP地址 ...

  9. 软考之PV操作(同步)

    这几天,陆续有那么三两个同学跟我讨论了一下关于软考上的PV操作的题,吾虽不才,但还是把同学们讲通了,在此,特分享一下自己的思路和想法,愿对大家有点帮助! 下面,我们就通过自己做过的试卷上两道题来分析: ...

随机推荐

  1. INTELLIJ IDEA集成CHECKSTYLE(转)

    转自:http://www.cnblogs.com/kiwi-wang/p/4166410.html 本文中使用intelliJ IDEA版本为14.0.1,其他版本差异不大,可同样安装. 下载安装C ...

  2. Android下如何理解onMeasure,onLayout的过程

    在Android中view如何完成绘制这个过程介绍了很多,但是很多理论化的东西,最近重新整理一下,通俗的讲解一下. View绘制过程就好比你向银行贷款, 在执行onMeasure的时候,好比银行告诉你 ...

  3. event.getAction()&MotionEvent.ACTION_MASK的原因

    看到下面代码中用了AND位运算是为了什么呢? public boolean onTouchEvent(MotionEvent event) { int action = event.getAction ...

  4. C++中的static成员

    C++中的static 成员永远是我心中的痛,记了好多次了,但是今天在项目中依然忘记了,今天写下来,方便以后不用再去Baidu.google搜索了. 在头文件中声明静态成员 static int i; ...

  5. C#位移运算符

    代码如下: /// <summary> /// 位移运算符"<<"左位移运算符,">>"右位移运算符 /// 在进行位移运算 ...

  6. C#利用ODP.NET往oracle中高效插入百万数据

    由于工作的原因,要使用winform来处理大量的数据,但是c#自带的System.data.OracleClient效率不是很高,在网上找了很久,找到了ODP.NET,是oracle为c#提供的.貌似 ...

  7. (转)SQL Server 2008将数据导出为脚本 [SQL Server]

    之前我们要将一个表中的数据导出为脚本,那么只有在网上找一个导出数据的Script,然后运行就可以导出数据脚本了.现在在SQL Server 2008的Management Studio中增加了一个新特 ...

  8. jquery获取checkbox被选中的值

    只用一个循环,就可以找出被选中的checkbox的值 var s; $("[name = b]:checkbox").each(function () {              ...

  9. 2.RxJava详解网址http

    RxJava 到底是什么 RxJava 好在哪 API 介绍和原理简析 1) Scheduler 的 API (二) 2) Scheduler 的原理(二) 3) 延伸:doOnSubscribe() ...

  10. Jenkins学习之——(1)Jenkins的安装与配置

    1.最近公司要求做自动化部署,于是自学了jenkins.这个参考书很少,网上的文章也讲得很模糊,于是打算把自己学习东西记下来,希望对大家有所帮助. 一.jenkins的安装 到jenkins官网(ht ...