求组合数
#include <bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int main(){
int c[2010][2010];
for(int i=0;i<=2000;i++){
for(int j=0;j<=i;j++){
if(!j) c[i][j]=1;
else c[i][j]=(c[i-1][j-1]%mod+c[i-1][j]%mod)%mod;
}
}
int q;
cin>>q;
while(q--){
int n,m;
cin>>n>>m;
cout<<c[n][m]<<endl;
}
return 0;
}
### next_permutation 生成全排列 依赖字典序
```c++
int p[]={1,2,3,4};
do{
for(int i=0;i<4;i++) cout<<p[i]<<" ";
cout<<endl;
}while(next_permutation(p,p+4));
手写 组合型枚举
#include <bits/stdc++.h>
using namespace std;
int pass[1010];
//int vst[1010];
int n,m;
void dfs(int u,int start){
if(u>m){
for(int i=1;i<=m;i++) cout<<pass[i]<<" ";
puts("");
return ;
}
for(int i=start;i<=n;i++){
pass[u]=i;
dfs(u+1,i+1);
pass[u]=0;
}
}
int main(){
cin>>n>>m;
dfs(1,1);
return 0;
}
to_string()
作用:将整型转换为 string 类型
函数头文件: < sstream >
string的find()函数 (rfind())
作用:找到字符串str在字符串s中(第一次)出现的位置
用法: s.find(str) [s str 均为 string类型]
返回值: str在s中出现的位置,如果匹配不到,则返回标记 npos (4294967295 亦即 int 类型的 -1)s.find(str) == s.npos
第二个参数为查找位置
find
find(ve.begin(),ve.end(),10);
find_if 查找第一个符合规则的元素 find_if_not 查找第一个不符合的元素
vector<int>::iterator it = find_if(ve.begin(), ve.end(), cmp());
vector<int>::iterator it = find_if_not(ve.begin(), ve.end(), cmp());
find_end:寻找指定序列的最后一次出现
find_first_if :在两个序列中找匹配元素
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int main() {
string a="1112233";
string b="52211333";
auto it=find_first_of(b.begin(),b.end(),a.begin(),a.end(),[](auto p1,auto p2){
return p1==p2;
})-b.begin();
cout<<it<<endl;
return 0;
}
adjacent_find() :用于在指定范围内查找 2 个连续相等的元素。
//查找 2 个连续相等的元素
ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last);
//查找 2 个连续满足 pred 规则的元素
ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last,BinaryPredicate pred);
string a="1233";
string b="52211333";
auto it=a.begin();
it=adjacent_find(it++,a.end());
cout<<*it<<endl;
auto it=adjacent_find(a.begin(),a.end());
cout<<*it<<endl;
search() :在范围[first1,last1)中搜索范围[first2,last2)定义的子序列的出现,返回指向第一个元素的迭代器。如果子序列不存在,则返回指向 last1 的迭代器。
string a="8089912233";
string b="9922";
auto it=search(a.begin(),a.end(),b.begin(),b.end());
cout<<*it<<endl;
和 search() 一样,search_n() 函数,用于在指定区域内查找第一个符合要求的子序列。不同之处在于,前者查找的子序列中可包含多个不同的元素,而后者查找的只能是包含多个相同元素的子序列。
string a="8089912233";
string b="9922";
auto it=search_n(a.begin(),a.end(),2,'3');
cout<<*it<<endl;
to_lower() to_upper() 以及transform()
transform(s.begin(),s.end(),s.begin(),::toupper);
//or
transform(s.begin(),s.end(),s.begin(),toupper);
unique()、erase()函数作用:去除重复的元素,只保留1个(将重复元素放到元素的后面)uique(begin,last) 左闭右开区间返回值:指向非重复元素最后一位的后一位
sort(res.begin(), res.end());
res.erase(unique(res.begin(), res.end()), res.end());
isdigit()作用:可用于检查传递的字符是否为数字字符[即 ‘0’ 到 ‘9’ ]
nth_element()功能:当采用默认的升序排序规则(std::less)时,该函数可以从某个序列中找到第 n 小的元素 K ,并将 K 移动到序列中第 n 的位置处。不仅如此,整个序列经过 nth_element() 函数处理后,所有位于 K 之前的元素都比 K 小,所有位于 K 之后的元素都比 K 大。注意:但并不一定保证调用后,所有元素升序排列
第k小数
注意:重复数字也算
scanf("%d%d", &n, &k);
for (int i = 0; i < n; ++i)
scanf("%d", &g[i]);
nth_element(g, g + k, g + n); //g-g+n 中 d第k元素 并且找到后移动到k
printf("%d", g[k]);
字符串转换
stoi 字符串转int(stoi,stol,stoul,stoull,stoll,stof,stod)
作用是将 n 进制的字符串转化为十进制,使用时包含头文件string.
定义如下:
int stoi( const std::string& str, std::size_t* pos = nullptr, int base = 10 );
char与string
char c[20];
string s="1234";
strcpy(c,s.c_str()); //string->char
s=c; //char->string