XDOJ1260 - 递推1
2014-08-28 21:52
369 查看
Description
在所有的N位数中,有多少个数中有偶数个数字3?
Input
多组数据,每行一个数N(N<=1000)
Output
每行输出一个数,答案mod12345
Sample Input
2
Sample Output
73
解题思路:
源于网上,自己太菜T_T。
以f(n,0)表示n位数中偶数个3的数字有多少,f(n,1)表示n位数中奇数个3的数字有多少。
其中f(1,0)=8(为了递推方便去掉了0,因为0不能做一个多位数的第一位),f(1,1)=1
考虑n的情况,n位数可以通过在n-1位数的最后面添加一位(0~9)得到,如果添加的是3,那么n-1位中原来奇数个3的数变成偶数个3,原来偶数个3的变成奇数个3;如果添加不是3,那么3的奇偶性不变。
所以
f(n,0) = 9*f(n-1,0)+f(n-1,1)
f(n,1) = 9*f(n-1,1)+f(n-1,0)
在所有的N位数中,有多少个数中有偶数个数字3?
Input
多组数据,每行一个数N(N<=1000)
Output
每行输出一个数,答案mod12345
Sample Input
2
Sample Output
73
解题思路:
源于网上,自己太菜T_T。
以f(n,0)表示n位数中偶数个3的数字有多少,f(n,1)表示n位数中奇数个3的数字有多少。
其中f(1,0)=8(为了递推方便去掉了0,因为0不能做一个多位数的第一位),f(1,1)=1
考虑n的情况,n位数可以通过在n-1位数的最后面添加一位(0~9)得到,如果添加的是3,那么n-1位中原来奇数个3的数变成偶数个3,原来偶数个3的变成奇数个3;如果添加不是3,那么3的奇偶性不变。
所以
f(n,0) = 9*f(n-1,0)+f(n-1,1)
f(n,1) = 9*f(n-1,1)+f(n-1,0)
#include<iostream> using namespace std; const int INF = 1000000000; const int M = 12345; const int D = 1000; long long f[D+1][2]; void init() { f[1][0] = 8; f[1][1] = 1; for(int i=2;i<=D;++i) { f[i][0] = f[i-1][1]+9*f[i-1][0]; f[i][1] = f[i-1][0]+9*f[i-1][1]; if(f[i][0]>INF) f[i][0]%=M; if(f[i][1]>INF) f[i][1]%=M; } } int main() { int n; init(); while(cin>>n) { if(n==1) cout<<9<<endl; else cout<<f [0]%M<<endl; } return 0; }
相关文章推荐
- POJ 1260, Pearls
- POJ 1260 Pearls DP
- POJ 1260 Pearls
- HDU 1260 Tickets
- poj 1260 Pearls 斜率优化dp
- COGS 1260 三元数对
- URAL 1260. Nudnik Photographer
- POJ 1260 Pearls
- XDOJ1011--金子上的友情
- XDOJ1121 - 排序
- XDOJ 1076 - 有没有女孩子愿意跟我一起回家种田~~
- wikioi 1260 快餐问题
- XDOJ1256-1118-1116
- BZOJ1260: [CQOI2007]涂色paint
- HDU 1260 Tickets(基础DP)
- HDU 1260 Tickets
- poj(1260,动归)
- n的m次方的最高位c++求法(xdoj 1029)
- 内角均为120度六边形面积求解(xdoj 1118)
- hdoj--1260--Tickets(简单dp)