当前位置:   article > 正文

【刷题记录】 LightOJ-1370 Bi-shoe and Phi-shoe 数论+素数_lightoj1370

lightoj1370

目录

一. 问题描述

二. 题解代码


一. 问题描述

Problem Description

已知每个长度为L的竹子,其分数p(L) = 其1~L中与其互素的元素个数,也就是欧拉函数

现在给出一系列n个学生的期望值,要求求出分数>=每个学生期望值的竹子最短长度的和。

也就是在满足竹子sorce>=A[i]&&竹子L最小。

二. 题解代码

已知:素数X的欧拉函数 = X - 1;

我们可以举例写出一些数字的欧拉函数来:

数字:1 2 3 4 5 6 7 8 9 10 11

欧拉:1 1 2 2 4 2 6 4 6 4  10

        由上我们发现:两个素数之间的数字的欧拉值介于两素数欧拉值之间,也就是每个素数为一个跃点。现在给你一个数字n,让n成为欧拉值,n一定位于两素数之间,那么:

(1)如果n+1是一个素数,那么(n+1)就是最小长度,其欧拉值为n;

(2)否则就找第一个>=(n+1)的素数p,其欧拉值为p-1,也一定为最优;

  1. #include <iostream>
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. const int maxn = 1000000 + 7;
  5. bool vis[maxn];
  6. int prime[maxn],tot,Arr[10007];
  7. typedef long long LL;
  8. void init(){
  9. tot = 0;
  10. memset(vis,0,sizeof(vis));
  11. vis[1] = 1;
  12. for(int i = 2;i<maxn;i++){
  13. if(!vis[i])prime[tot++] = i;
  14. for(int j = 0;j<tot;j++){
  15. if(i*prime[j]>=maxn)break;
  16. vis[i*prime[j]] = 1;
  17. if(i%prime[j]==0)break;
  18. }
  19. }
  20. }
  21. int main()
  22. {
  23. int T;
  24. scanf("%d",&T);
  25. int t = 0;
  26. init();
  27. while(T--){
  28. int n;
  29. scanf("%d",&n);
  30. for(int i = 0;i<n;i++){
  31. scanf("%d",&Arr[i]);
  32. }
  33. LL sum = 0;
  34. for(int i = 0;i<n;i++){
  35. int pos =lower_bound(prime,prime+tot,Arr[i]+1) - prime;
  36. sum+=prime[pos];
  37. }
  38. printf("Case %d: %lld Xukha\n",++t,sum);
  39. }
  40. return 0;
  41. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/947533
推荐阅读
相关标签
  

闽ICP备14008679号