bnu oj 13288 Bi-shoe and Phi-shoe

题目链接:

  http://www.bnuoj.com/contest/problem_show.php?pid=13288

题目大意:

  给出一个n,然后给出n个幸运数([1,m]中不能被m整除的数的数目总和n,在[1,n]中的数称为m的幸运数),求原来的n个数的和最小是多少?

解题思路:

  由素数的性质可以知道,素数的因子最少,所以每个幸运数的最小原数应该为素数,所以我们先把素数筛选出来,逐个比较就好啦。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int maxn = 1000005;
 8 const int N = 80000;
 9 
10 int a[maxn], b[N];
11 void isprim();
12 int main ()
13 {
14     int t, n, m, l=1;
15     memset (a, 0, sizeof(a));
16     memset (b, 0, sizeof(b));
17     isprim();
18 
19     scanf ("%d", &t);
20     while (t --)
21     {
22         long long sum = 0;
23         scanf ("%d", &n);
24         while (n --)
25         {
26             scanf ("%d", &m);
27             sum += b[a[m]];//因为在打素数表时候已经记录,所以就不用再循环寻找
28         }
29         printf ("Case %d: %lld Xukha\n", l++, sum);
30     }
31     return 0;
32 }
33 
34 void isprim()//筛选素数
35 {
36     int i, j = 0, k;
37     for (i=2; i<maxn; i++)
38         if (!a[i])
39         {
40             b[j++] = i;//抄出素数
41             for (k=i; k<maxn; k+=i)
42                 a[k] = j;
43         }
44     j = 0;
45     for (i=2; i<maxn; i++)
46     {
47         if (j < a[i])
48             j = a[i];
49         a[i] = j;//距离i最近的素数是第j个素数
50     }
51 }

 

  

你可能感兴趣的:(sh)