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 }
本文为博主原创文章,未经博主允许不得转载。