/*
ID:
PROG: prime3
LANG: C++
*/
/** 先求出總和是合法的質數,枚舉斜角 + 井字,剩下的空格用減法,使用binary search查找 **/
/**
Executing...
Test 1: TEST OK [0.011 secs, 2948 KB]
Test 2: TEST OK [0.011 secs, 2948 KB]
Test 3: TEST OK [0.032 secs, 2948 KB]
Test 4: TEST OK [0.065 secs, 2948 KB]
Test 5: TEST OK [0.108 secs, 2948 KB]
Test 6: TEST OK [0.151 secs, 2948 KB]
Test 7: TEST OK [0.270 secs, 2948 KB]
Test 8: TEST OK [0.464 secs, 3080 KB]
Test 9: TEST OK [0.518 secs, 2948 KB]
Test 10: TEST OK [0.724 secs, 3080 KB]
All tests OK.
**/
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
inline bool legal_digit_sum(vector<int> &D, unsigned int value,
const int &S)
{
int multiple[5] = {10000, 1000, 100, 10, 1}, sum = 0;
for (unsigned int i = 0; i != 5; ++i)
{
D[i] = (value / multiple[i]) % 10;
sum += D[i];
}
return(sum == S);
}
void quicksort_p(vector< vector<unsigned int> > &A, int left, int right, unsigned int x)
{
if (left < right)
{
int i = right + 1, j = left;
while (true)
{
while (i > j && A[--i][x] > A[left][x])
;
while (i > j && A[++j][x] < A[left][x])
;
swap(A[i][x], A[j][x]);
if (i == j)
break;
}
swap(A[left][x], A[j][x]);
quicksort_p(A, left, j - 1, x);
quicksort_p(A, j + 1, right, x);
}
}
inline void generate_primes(vector< vector<int> > &P,
vector<unsigned int> &PI,
vector< vector<unsigned int> > &PP,
const int &S)
{
const unsigned int SIZE = 1e5 + 1;
vector<bool> num(SIZE, true);
for (unsigned int i = 4; i < SIZE; i += 2)
num[i] = false;
for (unsigned int i = 6; i < SIZE; i += 3)
num[i] = false;
num[0] = num[1] = false;
for (unsigned int i = 5; i < SIZE; i += 4)
{
if (num[i])
{
if ((unsigned int long long)i * i < SIZE)
for (unsigned int j = (i << 1), k = i * i; k < SIZE; k += j)
if (num[k])
num[k] = false;
}
i += 2;
if (i < SIZE && num[i])
{
if ((unsigned int long long)i * i < SIZE)
for (unsigned int j = (i << 1), k = i * i; k < SIZE; k += j)
if (num[k])
num[k] = false;
}
}
vector<int> digit(5);
vector<unsigned int> partial(7);
/**
* partial index
* 0 - index04
* 1 - index13
* 2 - index2
* 3 - index014
* 4 - index12
* 5 - index0134
* 6 - index123
* **/
int multiple[5] = {10000, 1000, 100, 10, 1};
for (unsigned int i = 10000; i != SIZE; ++i)
if (num[i] && legal_digit_sum(digit, i, S))
{
P.push_back(digit);
PI.push_back(i);
partial[0] = digit[0] * multiple[0] + digit[4] * multiple[4];
partial[1] = digit[1] * multiple[1] + digit[3] * multiple[3];
partial[2] = digit[2] * multiple[2];
partial[3] = digit[0] * multiple[0] + digit[1] * multiple[1] + digit[4] * multiple[4];
partial[4] = digit[1] * multiple[1
usaco 4.3 the primes 2010.8.6
最新推荐文章于 2019-07-04 22:59:49 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)