2016百度之星资格赛 Problem B(大数+组合数)
题意:度熊面前有一个全是由1构成的字符串,被称为全1序列。你可以合并任意相邻的两个1,从而形成一个新的序列。对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列。最多200个1。
比如:如果序列是:(111)。可以构造出如下三个新序列:(111), (21), (12)。
分析:对于任意的相邻的两个1合并,那么总的个数就会减1,然后把2放在任意一个位置,也就是说,如果有x个2,那么总的数字个数就是n-x,相当于在这n-x中选择x个变成2,那么显然是组合数求解,在枚举x的个数即可。
但是,考虑到最大范围是200,会超long long,所以直接套大数模板就可以了。
下面是AC代码:
#include<stdio.h>
#include<string>
#include<string.h>
#include<iostream>
using namespace std; //compare比较函数:相等返回0,大于返回1,小于返回-1
int compare(string str1,string str2)
{
if(str1.length()>str2.length()) return ;
else if(str1.length()<str2.length()) return -;
else return str1.compare(str2);
}
//高精度加法
//只能是两个正数相加
string add(string str1,string str2)//高精度加法
{
string str; int len1=str1.length();
int len2=str2.length();
//前面补0,弄成长度相同
if(len1<len2)
{
for(int i=;i<=len2-len1;i++)
str1=""+str1;
}
else
{
for(int i=;i<=len1-len2;i++)
str2=""+str2;
}
len1=str1.length();
int cf=;
int temp;
for(int i=len1-;i>=;i--)
{
temp=str1[i]-''+str2[i]-''+cf;
cf=temp/;
temp%=;
str=char(temp+'')+str;
}
if(cf!=) str=char(cf+'')+str;
return str;
}
//高精度减法
//只能是两个正数相减,而且要大减小
string sub(string str1,string str2)//高精度减法
{
string str;
int tmp=str1.length()-str2.length();
int cf=;
for(int i=str2.length()-;i>=;i--)
{
if(str1[tmp+i]<str2[i]+cf)
{
str=char(str1[tmp+i]-str2[i]-cf+''+)+str;
cf=;
}
else
{
str=char(str1[tmp+i]-str2[i]-cf+'')+str;
cf=;
}
}
for(int i=tmp-;i>=;i--)
{
if(str1[i]-cf>='')
{
str=char(str1[i]-cf)+str;
cf=;
}
else
{
str=char(str1[i]-cf+)+str;
cf=;
}
}
str.erase(,str.find_first_not_of(''));//去除结果中多余的前导0
return str;
}
//高精度乘法
//只能是两个正数相乘
string mul(string str1,string str2)
{
string str;
int len1=str1.length();
int len2=str2.length();
string tempstr;
for(int i=len2-;i>=;i--)
{
tempstr="";
int temp=str2[i]-'';
int t=;
int cf=;
if(temp!=)
{
for(int j=;j<=len2--i;j++)
tempstr+="";
for(int j=len1-;j>=;j--)
{
t=(temp*(str1[j]-'')+cf)%;
cf=(temp*(str1[j]-'')+cf)/;
tempstr=char(t+'')+tempstr;
}
if(cf!=) tempstr=char(cf+'')+tempstr;
}
str=add(str,tempstr);
}
str.erase(,str.find_first_not_of(''));
return str;
} //高精度除法
//两个正数相除,商为quotient,余数为residue
//需要高精度减法和乘法
void div(string str1,string str2,string "ient,string &residue)
{
quotient=residue="";//清空
if(str2=="")//判断除数是否为0
{
quotient=residue="ERROR";
return;
}
if(str1=="")//判断被除数是否为0
{
quotient=residue="";
return;
}
int res=compare(str1,str2);
if(res<)
{
quotient="";
residue=str1;
return;
}
else if(res==)
{
quotient="";
residue="";
return;
}
else
{
int len1=str1.length();
int len2=str2.length();
string tempstr;
tempstr.append(str1,,len2-);
for(int i=len2-;i<len1;i++)
{
tempstr=tempstr+str1[i];
tempstr.erase(,tempstr.find_first_not_of(''));
if(tempstr.empty())
tempstr="";
for(char ch='';ch>='';ch--)//试商
{
string str,tmp;
str=str+ch;
tmp=mul(str2,str);
if(compare(tmp,tempstr)<=)//试商成功
{
quotient=quotient+ch;
tempstr=sub(tempstr,tmp);
break;
}
}
}
residue=tempstr;
}
quotient.erase(,quotient.find_first_not_of(''));
if(quotient.empty()) quotient="";
}
string c[][];
void init()
{
for(int i=;i<=;i++)
for(int j=;j<=;j++) c[i][j]="";
c[][]="";
c[][]=c[][]="";
for(int i=;i<=;i++)
{
for(int j=;j<=i;j++)
{
if(j==||j==i) c[i][j]="";
else c[i][j]=add(c[i][j],add(c[i-][j],c[i-][j-]));
}
}
}
int main()
{
init();
/*string str1,str2;
string str3,str4;
while(cin>>str1>>str2)
{
cout<<add(str1,str2)<<endl;
cout<<sub(str1,str2)<<endl;
cout<<mul(str1,str2)<<endl;
div(str1,str2,str3,str4);
cout<<str3<<" "<<str4<<endl;
}*/
int n;
while(scanf("%d",&n)==)
{
string ans="";
for(int i=n;i>=(n+)/;i--)
{
ans=add(ans,c[i][n-i]);
}
cout<<ans<<endl;
}
return ;
}
这是kuangbin的大数模板,以后就用这份模板好了- -
2016百度之星资格赛 Problem B(大数+组合数)的更多相关文章
- HDU 5686:2016"百度之星" - 资格赛 Problem B
原文链接:https://www.dreamwings.cn/hdu5686/2645.html Problem B Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5688:2016"百度之星" - 资格赛 Problem D
原文链接:https://www.dreamwings.cn/hdu5688/2650.html Problem D Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5685:2016"百度之星" - 资格赛 Problem A
原文链接:https://www.dreamwings.cn/hdu5685/2637.html Problem A Time Limit: 2000/1000 MS (Java/Others) ...
- [HDU5686]2016"百度之星" - 资格赛 Problem B
题目大意:给你n,规定一个串中相邻的两个1可以合并为一个2(别的不行),让你求长度为n的全1串最多能变成多少种不同的串. 解题思路:我们先来找一波规律,发现n=1,2,3,4,5时答案分别为1,2,3 ...
- [HDU5687]2016"百度之星" - 资格赛 Problem C
题目大意:有n个操作,每个操作是以下三个之一,要你实现这些操作. 1.insert : 往字典中插入一个单词2.delete: 在字典中删除所有前缀等于给定字符串的单词3.search: 查询是否在字 ...
- [HDU5688]2016"百度之星" - 资格赛 Problem D
题目大意:给你n个字符串,如果一个字符串可以通过重新排列变成另一个字符串,则认为这两个字符串相等.每输入一个字符串,输出这个字符串和与它相等的之前出现了几次. 解题思路:我们可以用map保存一个字符串 ...
- [HDU5685]2016"百度之星" - 资格赛 Problem A
题目大意:给你一个字符串,和一些问题,每个问题问你[l,r]子串的哈希值是多少. 哈希值计算方法为:$H(s)=\prod _{i=1} ^{i\leq len(s)}(s_i-28)(mod\ 99 ...
- 2016百度之星资格赛 Problem A(前缀积与求逆元)
题意:给出一个字符串,每次询问给出x和y要求算出从x到y的每个字符的(ASCII 码值-28)的值的积(mod9973). 分析:首先的想法肯定是算出每个位置的前缀积,然后只要F[y]/F[x-1]即 ...
- 2016百度之星 资格赛ABCDE
看题:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690 交题:http://acm.hdu.edu.cn/search.php ...
随机推荐
- Abp 领域事件简单实践 <四> 聚合根的领域事件
聚合根有个 DomainEvents 属性. 首先聚合根是一个实体.这个实体的仓储有变化(增删改)的时候,会触发这个DomainEvents 里的事件.就像EventBus.Trigger一样. pu ...
- vue之双向绑定
Vue的一大核心是双向绑定,在2.0中采用数据劫持,用Object.defineProperty实现,但作者已声明在3.0中会采用proxy实现 Object.defineProperty是什么? ...
- No valid host was found. There are not enough hosts available-----openstack建虚拟机直接报错
目录 No valid host was found. There are not enough hosts available-----openstack建虚拟机直接报错 一.问题现象: 二.解决思 ...
- vuejs开发流程
https://www.cnblogs.com/yexiaowang/p/8489250.html
- 【异常】ser class threw exception: java.sql.SQLException: The last packet successfully received from the server was 39,444 milliseconds ago. The last
1 详细异常 ser class threw exception: java.sql.SQLException: The last packet successfully received from ...
- nginx屏蔽版本号
nginx的http段添加 server_tokens off; 在nginx.conf文件内如上增加server_tokens off;就隐藏了
- Linux服务器TIME_WAIT进程的解决与原因
linux服务器上tcp有大量time_wait状态的解决方法和原因解释 毫无疑问,TCP中有关网络编程最不容易理解的是它的TIME_WAIT状态,TIME_WAIT状态存在于主动关闭socket连接 ...
- 用js刷剑指offer(反转链表)
题目描述 输入一个链表,反转链表后,输出新链表的表头. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = null; }*/ f ...
- #使用Python的turtle绘制正六边形、叠边形
1.#Python的turtle绘制正六边形 代码: len=100 #表示边长像素 import turtle as t #正六边形内角都是120度,外角60度 for i in range(6): ...
- python_公共方法
1.计算长度 value = "wangdianchao" # 计算字符个数(长度) number = len(value) print(number) 2.索引取值 value ...