您的位置:首页 > 其它

usaco.section1.5 && 2.1

2015-11-13 09:04 344 查看

(section1.5) SuperPrime Rib

找出
N
位的特殊质数,如 7331 就是一个特殊质数,因为 7331
是质数,733 是质数,73 和
7 也是质数,按升序输出

算法1:通过打表观察, 1 位的质数只有 2,3,5,7,而后面的只能在末尾添加 1,3,7,9
这几个数。所以我们先确定 1 位的,然后 DFS 后面的,每次
O( sqrt(n) )
判断一下是不是质数就行了。因为这样的特殊质数很多少,所以不会超时。

算法2i
位的特殊质数只能通过 i - 1 位的在末尾加上 1,3,7,9 得到,而这个是没有后效性的,可以 DP。设
F[ i ][ size[ i ] ] 代表 i 位的特殊质数,size[ i ]
代表个数那么 F[ i + 1][ size[ i + 1 ] ] = F[ i ][ size[ i ] ] * 10 + a[ i ],a[ i ]
就等于 1,3,7,9,其中还需要判断一下 F[ i ][ size[ i ] ] * 10 + a[ i ] 是不是质数,老方法。

// code I -----------------------------------------------------------------

#include <cstdio>

using namespace std;

int N, a[5] = {0, 1, 3, 7, 9};

inline bool isprime(int x) // check the prime
{
for (int i=2; i*i<=x; i++)
if (x % i == 0) return 0;
return 1;
}

void dfs(int num, int len)
{
if (len > N) return; //bigger than we wanted
if (len == N) { printf("%d\n", num); return; } //equal to we wanted

for (int i=1; i<=4; i++)
if (isprime(num * 10 + a[i])) dfs(num * 10 + a[i], len + 1);
}

int main(void)
{
freopen ("sprime.in", "r", stdin);
freopen ("sprime.out", "w", stdout);

scanf("%d", &N);
dfs(2, 1); dfs(3, 1); dfs(5, 1); dfs(7, 1);
return 0;
}

// code II -----------------------------------------------------------------

#include <cstdio>

using namespace std;

int N, a[5] = {0, 1, 3, 7, 9};
int f[9][50], size[50];

inline bool isprime(int x)
{
for (int i=2; i*i<=x; i++)
if(x % i == 0) return 0;
return 1;
}

int main()
{
freopen ("sprime.in", "r", stdin);
freopen ("sprime.out", "w", stdout);

scanf("%d", &N);
f[1][1] = 2; f[1][2] = 3; f[1][3] = 5; f[1][4] = 7;
size[1] = 4;
for (int i=2; i<=N; i ++){
for (int j=1; j<=size[i-1]; j++)
for (int k=1; k<=4; k++)
if(isprime(f[i-1][j] * 10 + a[k]))
f[i][++ size[i]] = f[i-1][j] * 10 + a[k];
}

for (int i=1; i<=size
; i++) printf("%d\n", f
[i]);
return 0;
}


( section2.1 ) Ordered Fractions

找出分母小于等于 N 的最简分数,按升序输出

这道题似乎不用写题解吧

#include <cstdio>
#include <algorithm>

using namespace std;

const int MAX_N = 165;

struct node{
int x, y;
}a[MAX_N * MAX_N];
int N, tot = 0;

int gcd(int x, int y)
{
if(y == 0) return x;
return gcd(y, x % y);
}

inline bool cmp(node a, node b)
{
return a.x * b.y < a.y * b.x;
}

int main()
{
//freopen("frac1.in", "r", stdin);
//freopen("frac1.out", "w", stdout);
scanf("%d", &N);
printf("0/1\n");
for (int i=2; i<=N; i++)
for (int j=1; j<=i; j++){
if(gcd(i, j) == 1)
a[++ tot].x = j; a[tot].y = i;
}

sort(a+1, a+tot+1, cmp);
for (int i=1; i<=tot; i++) printf("%d/%d\n", a[i].x, a[i].y);
printf("1/1\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: