A - Bi-shoe and Phi-shoe

A - Bi-shoe and Phi-shoe

题目链接:https://vjudge.net/problem/LightOJ-1370#author=iron_china
题目大意:
给出含有n个数字的序列a[],对于每个数字ai找到一个欧拉函数值大于等于ai的数bi,求找到的所有数bi的最小值之和sum。
解题思路:
不同的n对应的欧拉函数可能相同,所以需要开一个数组dp,存储不同的欧拉函数值对应的最小的n,再用后缀最小值维护一下,使dp[i]表示dp[i]的欧拉函数大于等于i且dp[i]是符合条件中最小的值。
代码:

 1 #include <bits/stdc++.h>
 2 using namespace std; 
 3 typedef long long ll;
 4 const ll maxn=1e6+100;
 5 ll INF=1e17+7;
 6 ll E[maxn];
 7 ll arr[maxn];
 8 ll dp[maxn];
 9 void euler_B(){
10     for(ll i=2;i<maxn;i++){  
11         if(!E[i])  
12         for(ll j=i;j<maxn;j+=i){  
13             if(!E[j])E[j]=j;  
14             E[j]=E[j]/i*(i-1);  
15         }  
16     }  
17 }
18 int main(){
19     ll T,n=0;
20     euler_B();
21     fill(dp,dp+maxn,INF);
22     for(ll i=2;i<maxn;i++){
23         dp[E[i]]=min(dp[E[i]],i);
24         n=max(n,E[i]);
25     }
26     for(ll i=n;i>=1;i--){
27         dp[i]=min(dp[i+1],dp[i]);
28     }
29     cin>>T;
30     ll num=0;
31     while(T--){
32         ll a;
33         ll sum=0;
34         num++;
35         scanf("%lld",&n);
36         for(ll i=1;i<=n;i++){
37             scanf("%lld",&a);
38             sum+=dp[a];
39         }
40         printf("Case %lld: %lld Xukha\n",num,sum);
41     }
42     return 1;
43 }

 

posted @ 2020-03-02 16:36  yya雨  阅读(156)  评论(0编辑  收藏  举报