这个题目明确说了不涉及大数,假设第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;
}

最新文章

  1. css水平垂直居中对齐方式
  2. hibernate学习(5)——多对多关系映射
  3. java io流 对文件夹的操作
  4. iOS 开发之路(使用WKWebView加载Html5) 四
  5. asp.net webservice 返回json数据乱码解决方法
  6. Codeforces 543D. Road Improvement (树dp + 乘法逆元)
  7. vmware workstation 10.0.1 install mac os mavericks
  8. JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
  9. 《火球——UML大战需求分析》(0.2)——目录
  10. ubuntu 搭建python2.x 抓取环境
  11. __builtin_popcount(n)
  12. ASP.NET Core 系列视频完结,新项目实战课程发布。
  13. mysql join用法简介
  14. 前端node.js npm i 报错Unexpected end of JSON input while parsing near
  15. bash小技巧1 获取文件当前路径
  16. MyBatis笔记----多表关联查询两种方式实现
  17. yml实例
  18. CF 1131 E. String Multiplication
  19. 在Java、Web和移动开发方面最值得关注的12大开源框架
  20. mysql中文编码问题

热门文章

  1. Python爬虫作业
  2. [oldboy-django][4python面试]有关csrf跨站伪造请求攻击
  3. MFC录制音频和播放音频
  4. ssh-add Could not open a connection to your authentication agent.
  5. Python获取程序运行目录和脚本目录
  6. JSP与JavaBeans
  7. 网络流 24 题汇总(LOJ 上只有 22 题???)
  8. [usaco jan 09] 安全路径 travel [最短路径树]
  9. 浅谈后缀自动机SAM
  10. 能量采集(bzoj 2005)