【60.97%】【BZOJ 1925】 [Sdoi2010]地精部落
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 1194 Solved: 728
[Submit][Status][Discuss]
Description
地精还是一种非常警觉的生物,他们在每座山峰上都可以设立瞭望台,并轮 流担当瞭望工作,以确保在第一时间得知外敌的入侵。 地精们希望这N 段山脉每段都可以修建瞭望台或酒馆的其中之一,只有满足 这个条件的整座山脉才可能有地精居住。 现在你希望知道,长度为N 的可能有地精居住的山脉有多少种。两座山脉A 和B不同当且仅当存在一个 i,使得 Ai≠Bi。由于这个数目可能很大,你只对它 除以P的余数感兴趣。
Input
Output
Sample Input
Sample Output
HINT
对于 20%的数据,满足 N≤10;
对于 40%的数据,满足 N≤18;
对于 70%的数据,满足 N≤550;
对于 100%的数据,满足 3≤N≤4200,P≤109
【题解】
f[i][j]表示以1..j这些数字作为开头,长度为i,且满足第一个数大于第二个数的方案数。
g[i][j]表示以1..j这些数字作为开头,长度为i,且满足第一个数小于第二个数的方案数。
f[i][j]所代表的每一个方案都可以与g[i][j]对应一个。
则只要求f就好。
f[i][j] = f[i][j-1] + f[i-1][i-(j-1)];
左边的话看f数组的定义就能理解。
右边:
要插入一个j放到开头。则第二个数字肯定是1..j-1之间。但是你不能加上f[i-1][j-1];
因为这样加上去就不满足定义了。
即:f[i-1][j-1]第一个和第二个是递减的,然后j又大于j-1.则变成连续三个递减了。。
那就加上f[i-1][i-(j-1)];
这个可以由f和g的一一对应关系想出来。
最后输出f[n+1][n+1],n+1次循环的时候放一个不存在的n+1在开头。就能起到累加所有答案的效果。
还有一个问题,就是如果f[i-1][i-(j-1)]所代表的序列中有和j相同的数字该怎么办?
那么就只要把大于等于j的数字都加上1就可以了
比如f[i-1][i-(j-1)]代表了序列{3,2,4};
现在j =3 ;
则把3,2,4中3和4加上1;
在把3放在首位
就变成了
{3,4,2,5}
大于了n?
那就全都再减去1呀
{2,3,1,4};
很巧妙。
【代码】
/**************************************************************
Problem: 1925
User: chengchunyang
Language: C++
Result: Accepted
Time:256 ms
Memory:856 kb
****************************************************************/ #include <cstdio>
#include <stdlib.h> const int MAXN = 4210; int n, p, f[2][MAXN] = { 0 },ans = 0; void input_data()
{
scanf("%d%d", &n, &p);
} void get_ans()
{
f[0][2] = 1;
for (int i = 3; i <= n+1; i++)
{
int now = i & 1,last = (i-1)&1;
for (int j = 1; j <= i; j++)
f[now][j] = (f[now][j-1] + f[last][i - (j - 1)]) % p;
}
} void output_ans()
{
int now = (n + 1) & 1;
f[now][n+1] = (f[now][n+1] * 2) % p;
printf("%d\n", f[now][n+1]);
} void special_judge()
{
if (n == 1)
{
printf("1");
exit(0);
}
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
input_data();
special_judge();
get_ans();
output_ans();
return 0;
}
最新文章
- ASP.NET Global 全局事件处理
- 第五百七十八、九天 how can I 坚持
- [爬虫学习笔记]基于Bloom Filter的url去重模块UrlSeen
- VS2012外接程序VMDebugger未能加载或导致了异常
- PS初始化配置
- 转:从BeagleBone谈AM335x硬件系统设计
- VB 字符串函数总结
- hdu 4707 Pet 2013年ICPC热身赛A题 dfs水题
- hdu 1542 Atlantis 段树区,并寻求,,,尼玛真坑人数据,不要打开一小阵!
- HDU 5718 Oracle(高精度)
- android自定义View之3D索引效果
- 2018-2019-2 《Java程序设计》第9周学习总结
- Java中基本数据和包装类的比较
- SSM 三大框架---事务处理
- 在腾讯云&;阿里云上部署JavaWeb项目(Tomcat+MySQL)
- art-template实战
- 学习笔记之HTML 教程 | 菜鸟教程
- xenserver系列之安装与配置
- 转 mysqli 事务常用方法
- kendo ui - DatePicker 日期时间系列
热门文章
- Android 安卓直播开源: RTMP 推流SDK
- IOIOI卡片占卜(Atcoder-IOIOI カード占い)(最短路)
- SSO单点登录学习总结(3)—— 基于CAS实现单点登录实例
- A glance on VDBI
- 【hihocoder 1562】⼩Hi的钟表
- Android多线程研究(6)——多线程之间数据隔离
- Wicket实战(二)hello world
- 【Java并发编程实战】-----“J.U.C”:CLH队列锁
- js进阶 13 jquery动画函数有哪些
- 微服务实战(二):使用API Gateway - DockOne.io