1 #include <stdio.h>
2
3  int main()
4 {
5 int a, b;
6
7 a ^= b;
8 b ^= a;
9 a ^= b;
10
11 return 0;
12 }

运用了异或的性质:两个相同的数异或等于0,一个数与0异或等于自身,即:a^a = 0, a^0=a.

缺点只适用于32-bit以内的整型,

PS:此性质还可以用来找出1...n,n个数中缺少的一个数.

1 #include <stdio.h>
2
3  int main()
4 {
5 int n;
6 int a[10];
7 while (scanf("%d", &n) != EOF) {
8 int tp = 1;
9
10 for (int i=1; i<n; i++) {
11 scanf("%d", &a[i]);
12 tp ^= a[i];
13 }
14
15 for (int i=1; i<=n; i++) {
16 tp ^= i;
17 }
18
19 printf("%d\n", tp);
20 }
21
22 return 0;
23 }

[Sth aside]

Other method

1 #include <stdio.h>
2
3  int main()
4 {
5 int a, b;
6
7 a = a + b;
8 b = a - b;
9 a = a - b;
10
11 return 0;
12 }
posted @ 2011-05-02 23:33 superbin 阅读(38) 评论(0) 编辑

ACM竞赛中题目的数据一般都可以用随机生成法+手动法。随机生成法主要用到随机函数rand().
int rand(void);
返回一个伪随机数a,a的取值范围是[0,RAND_MAX]。每次调用rand函数,都会返回内部算法生成的看似
不相关的一连串的数。该算法使用随机种子,随机种子的值可以用srand()函数初始化。
RAND_MAX是<cstdlib>头文件里定义的常量, 其值为32767.
例:生成范围是[a,b]的一个随机数,其中a > -1 , b < 32768.

int value;
srand();
value
= rand()%(a-b+1) + b;

如果要生成有负数的随机数,可以减去一个常数。
如果要生成64位的数,两个32位的随机数相乘。
类似的,可以根据情况而做相应的变换。
如果数据对象是字符串,大可以找一些英文文章。
总之呢,随机数的方法只是一个基本方法,数据的来源可以是很广泛的,这要根据你题目的需要而定。

当然,测试数据要尽可能的hack掉不正确的程序,所以出题人要尽可能的考虑到每一个边角数据,而边角数据
主要是手动法了。

下面看个实例:

HDOJ-2096

先写数据生成程序:

#include <stdio.h>
#include
<time.h>
#include
<stdlib.h>

int main()
{
int a, t=100;
freopen(
"in.txt", "w", stdout); //打开文件in.txt,进行写操作,这样printf()输出的信息将保存在文件里。

/* initialize random seed: */
srand(time(NULL));
a
= rand();
printf(
"%d\n", t);
while (t--) {
a
= rand();
printf(
"%d ", a);
a
= rand();
printf(
"%d\n", a);
}
return 0;
}

然后用正确的解题程序(或称为标程),运行数据,并生成输出文件out.txt

#include "stdio.h"

int main() {
//打开输入输出文件
freopen("in.txt", "r", stdin);
freopen(
"out.txt","w", stdout);
//代码部分
int a, b, sum;
int n;
scanf(
"%d", &n);
while (n--) {
sum
= 0;
scanf(
"%d %d", &a, &b);
if (a >= 100) a %= 100;
if (b >= 100) b %= 100;
sum
= a + b;
if (sum >= 100)
sum
%= 100;
printf(
"%d\n", sum);
}
return 0;
}
posted @ 2011-03-27 18:47 superbin 阅读(77) 评论(0) 编辑

1. 《Art of Programming Contest》 by Ahmed Shamsul Arefin

         

 

2. 《新编实用算法分析与程序设计》 作者:王建德、吴永辉

 

3. 《计算几何--算法设计与分析》 作者:周培德 

posted @ 2010-11-03 09:44 superbin 阅读(53) 评论(0) 编辑

一、学习资料

Blog1, Blog2,

论文1 -> 俞华程《矩阵乘法在信息学中的应用》

二、题目

1. hdoj-1575

描述:求矩阵A^k的主对角线元素和 (mod 9973).

PS: 入门题[二分求矩阵幂]

 

代码
#include <stdio.h>
#include
<string.h>
#define NL 10
#define MD 9973

struct Matrix {
int v[NL][NL];
Matrix () {
memset(v,
0, sizeof(v));
}
//矩阵相乘
void multiply(Matrix m, int n) {
Matrix m1;
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
for (int k=0; k<n; k++) {
m1.v[i][j]
+= v[i][k]*m.v[k][j];
if (m1.v[i][j] >= MD) m1.v[i][j] %= MD;
}
}
}
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++)
v[i][j]
= m1.v[i][j];
}
}
void print(int n) {
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++)
printf(
"%d ", v[i][j]);
printf(
"\n");
}
}
};

int main()
{
// freopen("data.in", "r", stdin);
// freopen("data.out", "w", stdout);
int t;
int n, k, k0;
scanf(
"%d", &t);
while (t--) {
scanf(
"%d%d", &n, &k);
Matrix m0, m1;
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++)
scanf(
"%d", &m0.v[i][j]);
}
m1
= m0;
/*二分求矩阵幂*/
k
--;
while (k>0) {
if (k&1) m1.multiply(m0,n);
m0.multiply(m0,n);
k
= k>>1;
}
int ans = 0;
for (int i=0; i<n; i++) {
ans
+= m1.v[i][i];
ans
%= MD;
}
printf(
"%d\n", ans);
}
return 0;
}

 

 

2. hdoj-1757

描述:

If x < 10, f(x) = x
If x >= 10, f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10)

构造递推矩阵:

 

代码
#include <stdio.h>
#include
<string.h>
#define NL 10
#define FOR(i,k,n) for(i=k;i<n;i++)

int md;
struct Matrix {
int v[NL][NL];
Matrix() {
memset(v,
0, sizeof(v));
}
void Multiply(Matrix m) {
int i, j, k;
Matrix m1;
FOR(i,
0,NL) {
FOR(j,
0,NL) {
FOR(k,
0,NL) {
m1.v[i][j]
+= v[i][k]*m.v[k][j];
if (m1.v[i][j]>=md) m1.v[i][j] %= md;
}
}
}
FOR(i,
0,NL) {
FOR(j,
0,NL) {
v[i][j]
= m1.v[i][j];
}
}
}
};

int main() {
int k;
while (scanf("%d%d", &k, &md) != EOF) {

Matrix m0, m1;
int i, j;
FOR(i,
0,NL) {
// printf("ok!");
scanf("%d", &m0.v[0][i]);
}

if (k<10) {
printf(
"%d\n", k);
continue;
}

FOR(i,
1,NL) {
m0.v[i][i
-1] = 1;
}
k
-= 10;
m1
= m0;
while (k>0) {
if (k&1) m0.Multiply(m1);
m1.Multiply(m1);
k
>>= 1;
}
int ans = 0;
FOR(i,
0,NL) {
ans
+= m0.v[0][i]*(NL-i-1);
if (ans>=md) ans %= md;
}
printf(
"%d\n", ans);
}
}

 

 

 

3. hdoj-2256

描述:求

分析:

 

代码
#include <stdio.h>
#include
<string.h>
#define NL 4
#define MD 1024
#define FOR(i,k,n) for(i=k;i<n;i++)

struct Matrix {
int v[NL][NL];
Matrix() {
memset(v,
0, sizeof(v));
}
void Multiply(Matrix m) {
int i, j, k;
Matrix m1;
FOR(i,
0,NL) {
FOR(j,
0,NL) {
FOR(k,
0,NL) {
m1.v[i][j]
+= v[i][k]*m.v[k][j];
if (m1.v[i][j]>=MD) m1.v[i][j] %= MD;
}
}
}
FOR(i,
0,NL) {
FOR(j,
0,NL) {
v[i][j]
= m1.v[i][j];
}
}
}
};

int main() {
int t, n;
scanf(
"%d", &t);
while (t--) {
scanf(
"%d", &n);
Matrix m0, m1;
m0.v[
0][0] = 5;
m0.v[
0][1] = 12;
m0.v[
1][0] = 2;
m0.v[
1][1] = 5;
m1
= m0;
n
--;
while (n>0) {
if (n&1) m0.Multiply(m1);
m1.Multiply(m1);
n
>>= 1;
}
int ans = m0.v[0][0];
ans
= (ans*2-1+MD)%MD;
printf(
"%d\n", ans);
}
return 0;
}


 

4.poj-3233

描述:Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.

分析:

  1. if k is odd then S = A + ... + Ak/2Ak/2+1(A + ... + Ak/2) ,else   S = A + ... + Ak/2Ak/2(A + ... + Ak/2),

2. goto calculate k/2.

ps:用c++写的,效率很低,有待改进。

代码
#include <stdio.h>
#include
<string.h>
#define NL 30

int n, md;

class Matrix {
public:
int v[NL][NL];

Matrix() {
memset(v,
0, sizeof (v));
}

Matrix
& operator =(const Matrix &m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
this->v[i][j] = m.v[i][j];
}
return *this;
}

Matrix Multiply(Matrix m) {
Matrix m1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
m1.v[i][j]
+= v[i][k] * m.v[k][j];
m1.v[i][j]
%= md;
}
}
}
return m1;
}

Matrix Add(Matrix m) {
Matrix m1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
m1.v[i][j]
= (v[i][j] + m.v[i][j]) % md;
}
}
return m1;
}

Matrix Pow(
int k) {
Matrix m1, m0;
m1
= m0 = *this;
k
--;
while (k > 0) {
if (k & 1) m1 = m1.Multiply(m0);
m0
= m0.Multiply(m0);
k
>>= 1;
}
return m1;
}

void Print() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
printf(
"%d ", v[i][j]);
printf(
"\n");
}
}
};
Matrix m0, m1;

Matrix cal(
int k) {
Matrix m;
if (k == 1) return m0;
if (k & 1) {
Matrix mx
= cal(k / 2);
Matrix my
= m0.Pow(k / 2 + 1);
return mx.Add(mx.Multiply(my).Add(my));
}
else {
Matrix mx
= cal(k / 2);
Matrix my
= m0.Pow(k / 2);
return mx.Add(my.Multiply(mx));
}
}

int main() {
int k;
scanf(
"%d%d%d", &n, &k, &md);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
scanf(
"%d", &m0.v[i][j]), m0.v[i][j] %= md;
}
m1
= cal(k);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf(
"%d%c", m1.v[i][j], (j == n - 1) ? '\n' : ' ');
}
}
return 0;
}

 

  


 

posted @ 2010-11-02 12:31 superbin 阅读(63) 评论(0) 编辑

1. uva 11880 - Ball in a Rectangle -> Wrong [The Sixth Hunan Collegiate Programming Contest Semilive]

2. poj 3504 -> Unsolved

3. 数论 -> BigLoad

4. 计算几何 -> BigLoad

5. 矩阵乘法的应用 -> SmallLoad

posted @ 2010-11-01 10:26 superbin 阅读(54) 评论(0) 编辑
摘要: 1. IEEE 754 浮点数的表示精度探讨阅读全文
posted @ 2010-10-30 21:55 superbin 阅读(29) 评论(0) 编辑
摘要: 学习资料:论文一,论文二Rabin-Karp string search algorithm1.pku-1200描述:求在文本中出现的不同子串(给定长度)的个数。分析:最初"You may assume that the maximum number of substrings formed by the possible set of characters does not exceed 16 ...阅读全文
posted @ 2010-10-29 11:22 superbin 阅读(70) 评论(0) 编辑
摘要: 转自: Here使用Java操作文本文件的方法详解 摘要: 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类,这两个类都是抽象类,Writer中 write(char[] ch,int off,intlength),flush()和close()方法为抽...阅读全文
posted @ 2010-10-28 10:21 superbin 阅读(53) 评论(0) 编辑
摘要: hdu-1075描述:将火星文翻译成英文。反思:好久以前做的,现在又拿来写了个字典树,递归比非递归确实慢,一个小错误导致wa数次。代码hdu-1251描述:求前缀中包含给定串的单词数。变形:结点记录的信息是建树时经过该结点的次数。hdu-1298描述:手机智能拼音输入法[见题]反思:strcmp()函数搞错,wa数次,查错过错很纠结!代码zju-1109描述:同hdu-1075.Say_Sth:这...阅读全文
posted @ 2010-10-27 16:50 superbin 阅读(48) 评论(0) 编辑
摘要: 一、学习1.sha崽2.几篇论文二、练习题1.Sliding Window [pku-2823]分析:单调队列入门级别的题目。单调队列比普通队列多了一个操作---队尾删除。队列元素有两个域,<index,value>。由于元素是按index(下标)从小到大插入的,所以index在队列中保持单调递增;为保持value的单调性,可以在队尾插入时实现。而队首元素就是所需要的最小值(或最大值)...阅读全文
posted @ 2010-10-09 08:45 superbin 阅读(198) 评论(0) 编辑