个人觉得博客真的不好用,还莫名其妙选择功能都不能用了,再不字都叠一块去了.难看死了,除了贴代码稍微好看些,真的比QQ空间差远了
其实吧,模板这个东西呢是要自己经常敲敲才会靠谱
这里仅仅提供一个索引,这样找的时候会方便一些
(持续更新中.......)
快速幂 hash散列 组合数 十进制转化为二进制
接下来是一些实用小模板,可能是从原代码粘贴过来的,带有原题目的变量痕迹,稍微改改还是能用的
1.快速幂(例题参见第三次排位赛第四题)
int quickpow(int m,int n,int k)
{
int b = 1;
while (n > 0)
{
if (n & 1)//按位与运算,可以判断n的奇偶性,也可以判断n的二进制最后一位是1还是0(当然这两个本质是一样的)
b = ((long long)b*m)%k;
//显然如果n的二进制末尾是1就要归入计算,末尾不是0就不计算
n = n >> 1 ;
m = ((long long)m*m)%k;
}
return b;
}
2.hash函数
直接参考第三次排位赛第三题,因为那题就是纯的散列,或者说最简单的没有加修饰的
#include <iostream>
#include <cstdio>
#include <string.h>
//#include <string>//这个加上后竟然会时间增加几十秒
#include <vector>
#include <cmath>
#include <algorithm>
#include <queue>
#include <fstream>
#define maxn 100007
using namespace std;
typedef unsigned long long ull;
vector <ull> a[100008];
int main()
{
int t;
char sl[105];
ull temp = 0;
for (int i=0; i<100008; i++)//此处酌情考虑,关键时刻
a[i].clear();
while(~scanf("%s", sl))
{
temp = 0;
//int len = sizeof sl;此处注意不要脑子糊涂了
int len = strlen(sl);
for (int i=0; i<len; i++)
temp = (temp*271 + sl[i] - '0');
int temp2 = temp%maxn;
int ans = 1;
for (int i=0; i<a[temp2].size(); i++)
{
if (a[temp2][i] == temp)
ans++;
}
a[temp2].push_back(temp);
printf("%d\n", ans);
}
return 0;
}
3.排列组合模板
memset(a, 0, sizeof a);
//memset(c, 0, sizeof c);
//注意此处加上会导致超过储存限制,一般组合数是二维数组开的还是比较大的,memset一下还是相当费时的,根据需要决定是否需要预清空,像这题其实我们需要用到的数都会进行相应赋值,就不用担心初始化问题了
c[0][0] = 1;
for (int i=1; i<=n; i++)
{
c[i][0] = 1;
c[i][i] = 1;
for (int j=1; j<=i/2; j++)
{
c[i][j] = (c[i-1][j-1] + c[i-1][j])%p;
c[i][i-j] = c[i][j];
}
}
4.十进制转化为二进制,并求得二进制中1的个数
memset(a, 0, sizeof a);
//memset(c, 0, sizeof c);
//注意此处加上会导致超过储存限制,一般组合数是二维数组开的还是比较大的,memset一下还是相当费时的,根据需要决定是否需要预清空,像这题其实我们需要用到的数都会进行相应赋值,就不用担心初始化问题了
c[0][0] = 1;
for (int i=1; i<=n; i++)
{
c[i][0] = 1;
c[i][i] = 1;
for (int j=1; j<=i/2; j++)
{
c[i][j] = (c[i-1][j-1] + c[i-1][j])%p;
c[i][i-j] = c[i][j];
}
}
#include <iostream>
#include <cstdio>
#include <string.h>
//#include <string>//这个加上后竟然会时间增加几十秒
#include <vector>
#include <cmath>
#include <algorithm>
#include <queue>
#include <fstream>
#define maxn 100007
using namespace std;
int a[100];
int main()
{
int n;
while (~scanf("%d", &n))
{
int num = 1;
a[0] = 0;
while (n>0)
{
if (n & 1)
{
a[0]++;
a[num++] = 1;
}
else
a[num++] = 0;
n >>= 1;
}
for (int i=num-1; i>0; i--)
cout << a[i];
cout << endl;
printf("二进制表达式中有%d个1\n", a[0]);
}
return 0;
}