题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=70017#problem/A
题意:给你一组数字,让你求欧拉函数的值大于等于它的数的和的最小值
例如:给你1 2 3,f(2)=1;f(3)=2;f(5)=4,因为没有数的欧拉函数的值等于3,
则需要去欧拉函数大于3的数中的最小值
思路:先预处理出1到N的欧拉函数的值,然后对其处理使得欧拉函数是单调不减的,在从N到1求每个欧拉函数对应的原值,这样求的每个存在的欧拉函数对应的原值是最小的。
#include<stdio.h> #include<string.h> using namespace std; const int N=1500000; int a[N+5]; int b[N+5]; void Init_oula()//预处理求出1到N的欧拉函数的值 { int i,j; memset ( a,sizeof (a)) ; for ( i = 2 ; i <= N ; i ++ ) {//筛选求a if ( ! a[i] ) { for ( j = i ; j <= N ; j += i ) { if ( ! a[j] ) a[j ] = j ; a[j] = a[j] / i * ( i - 1 ) ; } } } } int mmax(int a,int b){ if(a>b) return a; else return b; } int main() { int T,n,k,cnt=0; long long ans; Init_oula(); memset(b,sizeof(b)); for(int i=1;i<=N;i++) a[i]=mmax(a[i],a[i-1]);//保证欧拉函数的值是单调不减的 for(int i=N;i>=1;i--) b[a[i]]=i; //for(int i=1;i<=100;i++) printf("%d\n",a[i]); for(int i=1;i<=N;i++){ if(b[i]==0){ int t=i; while(b[i]==b[t] && t<=N){ t++; } b[i]=b[t]; } } //for(int i=1;i<=100;i++) printf("%d\n",b[i]); b[0]=0; scanf("%d",&T); while(T--){ cnt++; ans=0; scanf("%d",&n); while(n--){ scanf("%d",&k); ans+=b[k]; } printf("Case %d: %lld Xukha\n",cnt,ans); } return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。