UVA 10198 Counting
2015-10-05 10:05
232 查看
Counting |
The Problem
Gustavo knows how to count, but he is now learning how write numbers. As he is a very good student, he already learned 1, 2, 3 and 4. But he didn't realize yet that 4 is different than 1, so he thinks that 4 is another way to write 1. Besides that, he ishaving fun with a little game he created himself: he make numbers (with those four digits) and sum their values. For instance:
132 = 1 + 3 + 2 = 6 112314 = 1 + 1 + 2 + 3 + 1 + 1 = 9 (remember that Gustavo thinks that 4 = 1)
After making a lot of numbers in this way, Gustavo now wants to know how much numbers he can create such that their sum is a number n. For instance, for n = 2 he noticed that he can make 5 numbers: 11, 14, 41, 44 and 2 (he knows how to count them up, but he
doesn't know how to write five). However, he can't figure it out for n greater than 2. So, he asked you to help him.
The Input
Input will consist on an arbitrary number of sets. Each set will consist on an integer n such that 1 <= n <= 1000. You must read until you reach the end of file.The Output
For each number read, you must output another number (on a line alone) stating how much numbers Gustavo can make such that the sum of their digits is equal to the given number.Sample Input
2 3
Sample Output
5 13
题意:Gustavo数数时总是把1和4搞混,他觉得4仅仅是1的第二种写法。给出一个整数n,Gustavo想知道有多少个数的数字之和恰好为n。比如,当n=2时,有5个数:11、14、41、44、2。
分析:如果 F(n) 表示使用 1。2,3,4 构建的和为 n 的序列总数,则这些序列中,以 1 为開始的序列种数为 F(n - 1)。以2为開始的为 F(n - 2)。以3開始的序列总数为 F(n - 3)、以4開始的序列总数为 F(n - 4),因为 Gustavo 把 4 当作 1,则有 F(n - 4) = F(n - 1),故 F(n) = F(n - 1) + F(n - 2) + F(n - 3) + F(n - 4) = 2 * F(n - 1) + F(n - 2) + F(n - 3)。
边界条件: F(1) = 2, F(2) = 5。 F(3) = 13。
#include<string> #include<iostream> #include<vector> #include<algorithm> using namespace std; vector<string> v; string add(string a, string b) { string s; reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); int i = 0; int m, k = 0; while(a[i] && b[i]) { m = a[i] - '0' + b[i] - '0' + k; k = m / 10; s += (m % 10 + '0'); i++; } if(i == a.size()) { while(i != b.size()) { m = k + b[i] - '0'; k = m / 10; s += m % 10 + '0'; i++; } if(k) s += k + '0'; } else if(i == b.size()) { while(i != a.size()) { m = k + a[i] - '0'; k = m / 10; s += m % 10 + '0'; i++; } if(k) s += k + '0'; } reverse(s.begin(), s.end()); return s; } void solve() { v.push_back("0"); v.push_back("2"); v.push_back("5"); v.push_back("13"); string s; for(int i = 4; ; i++) { s = add(v[i-1], v[i-1]); s = add(v[i-2], s); s = add(v[i-3], s); v.push_back(s); if(v[i].size() > 1001) break; } } int main() { solve(); int n; int Size = v.size(); while(cin >> n) { cout << v << endl; } return 0; }
相关文章推荐
- 学习ThinkPHP3.2.2:video12,登录界面的显示
- 程序员和工程师有什么不一样?
- 学习ThinkPHP3.2.2:video12,插入一条用户数据SQL
- 学习ThinkPHP3.2.2:video12,建立用户表的sql
- 函数模板
- Just4Fun - Comparaison between const and readonly in C#
- 使用JBoss Tool反向创建PO类
- Lombox 配置使用
- 学习ThinkPHP3.2.2:video12,更改模板路径替换规则
- linux 下文件的压缩与解压(3)
- 学习ThinkPHP3.2.2:video12,后台目录的组织
- unity官方demo学习之Stealth(十二)角色生命值
- Java基础知识强化之集合框架笔记25:Vector的特有功能
- BZOJ 2705: [SDOI2012]Longge的问题(euler函数)
- Android Studio的top level element is not completed问题
- http_banner获取v0.2
- 数据库以及线程发生死锁的原理及必要条件,如何避免死锁
- 四则运算
- 删除数据库关键数据文件后实例是否会崩溃
- Bootstrap CSS——表单(一)