hdu1708(C++)
这个题目明确说了不涉及大数,假设第i个为b[i]:
b[0]=s1;
b[1]=s2;
b[3]=s1+s2;
b[4]=s1+2*s2;
b[5]=2*s1+3*s2;
b[6]=3*s1+5*s2;
b[7]=5*s1+8*s2;
………………
于是s1和s2的系数从某一项开始分别成斐波那契数列,于是只要算出b[k]中有多少个s1和多少个s2即可解决问题
#include<iostream>
#include<string>
using namespace std;
int main()
{
int i,j,p,c,k,T;
cin>>T;
string s1,s2;
while(T--){
cin>>s1>>s2>>k;
int a[51];
int b[26],c[26];
a[0]=1,a[1]=1; //初始化斐波那契数列
for(i=0;i<26;i++)
c[i]=b[i]=0; //每一项都设置为0
for(i=2;i<k;i++)
a[i]=a[i-1]+a[i-2];
for(i=0;i<s1.size();i++)
b[s1[i]-'a']++;
for(i=0;i<s2.size();i++)
c[s2[i]-'a']++;
if(k==0)
{
for(char ch='a';ch<='z';ch++)
cout<<ch<<":"<<b[ch-'a']<<endl;
cout<<endl;
continue;
}
if(k==1)
{
for(char ch='a';ch<='z';ch++)
cout<<ch<<":"<<c[ch-'a']<<endl;
cout<<endl;
continue;
}
for(i=0;i<26;i++)
{
b[i]=b[i]*a[k-2]; //注意对应关系
c[i]=c[i]*a[k-1];
c[i]=c[i]+b[i];
}
for(char ch='a';ch<='z';ch++)
cout<<ch<<":"<<c[ch-'a']<<endl;
cout<<endl;
}
return 0;
}
如果涉及大数,将上述代码做一个改进·也可以做出来,下面还有一个涉及大数的版本
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
typedef vector<vector<int>>vt;
class letter //将每一个字母看为对象
{
public:
vt v; //二维向量来储存大数
letter(){ vt v1(51); v = v1;};
char ch;
};
int main()
{
int T,i,k,j,t,p,c;
cin >> T;
string s1, s2;
while (T--)
{
cin >> s1 >> s2 >> k;
letter L[26]; //定义a-z 26个对象
for (i = 0; i < 26; i++)
{
L[i].ch = 'a' + i;
L[i].v[0].push_back(0);
L[i].v[1].push_back(0); //初始化前两项
}
for (i = 0; i < s1.size(); i++)
L[s1[i] - 'a'].v[0][0]++;
for (i = 0;i<s2.size();i++)
L[s2[i] - 'a'].v[1][0]++;
for (i = 0; i < 26;i++)
for (j =2; j <=k;j++)
{
c = 0;
if (L[i].v[j - 1].size()>L[i].v[j - 2].size())
L[i].v[j - 2].insert(L[i].v[j - 2].begin(),0);
for (t = L[i].v[j - 2].size() - 1; t >= 0; t--)
{
p = L[i].v[j - 1][t] + L[i].v[j - 2][t] + c;
L[i].v[j].push_back(p % 10);
c = p / 10;
}
if (c>0)
L[i].v[j].push_back(c);
reverse(L[i].v[j].begin(), L[i].v[j].end());
}
//-----------------------------------以上实现大数相加
for (i = 0; i < 26; i++)
{
cout << L[i].ch << ":";
for (j = 0; j < L[i].v[k].size(); j++)
cout << L[i].v[k][j];
cout << endl;
}
cout << endl;
} //控制输出
return 0;
}
hdu1708(C++)的更多相关文章
- OJ题目分类
POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006 POJ1008 POJ1013 P ...
随机推荐
- Normal synchronous FIFO mode 和 Show-ahead synchronous FIFO mode
FIFO是先进先出,可以用fifo来处理跨时钟域的数据传输问题,用到的地方特别多,一定要搞会. 在学习调用fifo的IP核中发现有normal synchronous FIFO mode 和 Show ...
- DOM的相关概念
[前面的话]DOM全称是Document Object Model,即文档对象模型.我们常说的html文档其实就是一个DOM树,DOM操作就是在内存中找到DOM树上我们想要的DOM对象,对它的属性进行 ...
- 通过 purge_relay_logs 自动清理relaylog
使用背景 线上物理备份任务是在从库上进行的,xtrabackup会在备份binlog的时候执行flush logs,relay-log会rotate到新的一个文件号,导致sql thread线程应用完 ...
- maven国内镜像
<?xml version="1.0" encoding="UTF-8"?> <!--Licensed to the Apache Softw ...
- ruby 规整git commit 信息
实现过程: 1.使用git log 可以获取到所有git commit.对命令加入参数后,可以获取某段时间的log.和只输出log的某些字段.如: [root@localhost crowd-web- ...
- POJ 2104:K-th Number(主席树静态区间k大)
题目大意:对于一个序列,每次询问区间[l,r]的第k大树. 分析: 主席树模板题 program kthtree; type point=record l,r,s:longint; end; var ...
- 【bzoj3771】Triple FFT+容斥原理
题目描述 樵夫的每一把斧头都有一个价值,不同斧头的价值不同.总损失就是丢掉的斧头价值和. 他想对于每个可能的总损失,计算有几种可能的方案. 注意:如果水神拿走了两把斧头a和b,(a,b)和(b,a)视 ...
- linux服务器上设置多主机头,设置多web站点
假设VPS的IP是58.130.17.168,有两个域名指向该IP,分别是domain1.com, domain2.com, 修改/etc/httpd/conf/httpd.conf,在文件的最后加入 ...
- 服务器和客户端Socket单向通信例子
看了两天socket通信,也参考了网上其他人是怎么写的. 下面我把最简单的socket例程贴出来 server代码: public class Server { private static int ...
- linux系统——机制与策略(二)
策略与机制 大部分策略与机制的区别定义是,策略是描述如何实现什么功能,机制则是需要实现怎样的功能.在"The Art of Unix Programming" 中Raymond通过 ...