LightOJ 1370 Bi-shoe and Phi-shoe

 1 /*
 2  LightOJ 1370 Bi-shoe and Phi-shoe
 3  http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1370
 4  数论 欧拉函数
 5  坑点是答案会爆int!!!!
 6  */
 7 #include <cstdio>
 8 #include <algorithm>
 9 #include <cstring>
10 #include <cmath>
11 #include <vector>
12 #include <queue>
13 #include <iostream>
14 #include <map>
15 #include <set>
16 //#define test
17 using namespace std;
18 const int Nmax=1e6+5e5;//Nmax一定要大于1e6否则会找不到答案
19 int phi[Nmax];
20 int prime[Nmax];
21 int is_prime[Nmax];
22 int prime_cnt;
23 void get()
24 {
25     phi[1]=1;
26     for(int i=2;i<Nmax;i++)
27         is_prime[i]=1;
28     for(long long i=2;i<Nmax;i++)
29     {
30         if(is_prime[i])
31         {
32             prime[++prime_cnt]=i;
33             phi[i]=i-1;
34         }
35         for(int j=1;j<=prime_cnt;j++)
36         {
37             if(i*prime[j]>=Nmax)
38                 break;
39             is_prime[i*prime[j]]=0;
40             if(i%prime[j]==0)
41             {
42                 phi[i*prime[j]]=phi[i]*prime[j];
43                 break;
44             }
45             else
46                 phi[i*prime[j]]=phi[i]*(prime[j]-1);
47         }
48     }
49 }
50 int main()
51 {
52     #ifdef test
53     #endif
54     get();    
55     phi[1]=0;//此题要求phi[1]=0;
56     //for(int i=1;i<Nmax;i++)
57     //{
58         //num[i].id=i;
59         //num[i].val=phi[i];
60     //}
61     //sort(num+1,num+Nmax);
62     //for(int i=1;i<=40;i++)
63     //{
64         //printf("phi[%d]:%d\n",i,phi[i]);
65     //}
66     int t,n;
67     scanf("%d",&t);
68     for(int ttt=1;ttt<=t;ttt++)
69     {
70         scanf("%d",&n);
71         long long ans=0LL;//此题一大坑点,ans会爆int
72         int a;
73         for(int i=1;i<=n;i++)
74         {
75             scanf("%d",&a);
76             for(int j=a+1;j<Nmax;j++)//强力减枝!
77             {
78                 if(phi[j]>=a)
79                 {
80                     ans+=1LL*j;
81                     break;
82                 }
83             }
84         }
85         printf("Case %d: %lld Xukha\n",ttt,ans);
86     }
87     return 0;
88 }

 

转载于:https://www.cnblogs.com/BBBob/p/6762566.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值