题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12506&rd=15496
用modPow方法求幂取余,其他地方不变,程序快了20多倍。之前需要500ms,现在只需20ms。
代码如下:
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
using namespace std;
/*************** Program Begin **********************/
const int MOD = 1e9 + 9;
class CharacterBoard2 {
private:
// Finds x raised to the y-th exponent modulo MOD
int modPow(int x, int y)
{
long long res = 1, a = x;
while (y > 0) {
if (y & 1) {
res = (res * a) % MOD;
}
a = (a * a) % MOD;
y >>= 1;
}
return static_cast<int> (res);
}
public:
int countGenerators(vector <string> fragment, int W, int i0, int j0) {
long long res = 0;
int N = fragment.size();
int M = fragment[0].size();
string gen;
int pos[10][10];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
pos[i][j] = ( (i + i0) * W + (j + j0) );
}
}
for (int len = 1; len <= W; len++) {
gen.assign(len, '#');
bool ok = true;
int fill = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
int index = pos[i][j] % len;
if ('#' == gen[index]) {
gen[index] = fragment[i][j];
++fill;
} else if (gen[index] != fragment[i][j]) {
ok = false;
break;
}
}
if (!ok) {
break;
}
}
if (!ok) {
continue;
}
res += modPow(26, len - fill);
res %= MOD;
}
return static_cast<int> (res);
}
};
/************** Program End ************************/