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 }