• Bi-shoe and Phi-shoe(欧拉筛)


    Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a very popular coach for his success. He needs some bamboos for his students, so he asked his assistant Bi-Shoe to go to the market and buy them. Plenty of Bamboos of all possible integer lengths (yes!) are available in the market. According to Xzhila tradition,

    Score of a bamboo = Φ (bamboo's length)

    (Xzhilans are really fond of number theory). For your information, Φ (n) = numbers less than n which are relatively prime (having no common divisor other than 1) to n. So, score of a bamboo of length 9 is 6 as 1, 2, 4, 5, 7, 8 are relatively prime to 9.

    The assistant Bi-shoe has to buy one bamboo for each student. As a twist, each pole-vault student of Phi-shoe has a lucky number. Bi-shoe wants to buy bamboos such that each of them gets a bamboo with a score greater than or equal to his/her lucky number. Bi-shoe wants to minimize the total amount of money spent for buying the bamboos. One unit of bamboo costs 1 Xukha. Help him.

    Input

    Input starts with an integer T (≤ 100), denoting the number of test cases.

    Each case starts with a line containing an integer n (1 ≤ n ≤ 10000) denoting the number of students of Phi-shoe. The next line contains n space separated integers denoting the lucky numbers for the students. Each lucky number will lie in the range [1, 106].

    Output

    For each case, print the case number and the minimum possible money spent for buying the bamboos. See the samples for details.

    Sample Input

    3

    5

    1 2 3 4 5

    6

    10 11 12 13 14 15

    2

    1 1

    Sample Output

    Case 1: 22 Xukha

    Case 2: 88 Xukha

    Case 3: 4 Xukha

    代码:

    欧拉筛

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<map>
    #include<set>
    #include<vector>
    #include<cmath>
    #include<stdlib.h>
    
    const int maxn=1e6+5;
    typedef long long ll;
    using namespace std;
     
    int prime[1000005];
    bool vis[1000005];
    void erla() {
    	int cnt =0;
    	memset(vis,false,sizeof(vis));
    	memset(prime,0,sizeof(prime));
    	for(int t=2; t<=1000005; t++) {
    		if(!vis[t]) {
    			prime[cnt++]=t;
    		}
    		for(int j=0; j<cnt&&t*prime[j]<=1000005; j++) {
    			vis[t*prime[j]]=true;
    			if(t%prime[j]==0) {
    				break;
    			}
    		}
    	}
    }
    
    int main()
    {
    	int T;
        cin>>T;
        erla();
        int n;
        int cnt=1;
        while(T--)
        {
        	cin>>n;
        	ll sum=0;
        	int x;
        	int l,r;
        	for(int t=0;t<n;t++)
        	{
        		scanf("%d",&x);
        	    for(int j=x+1;j<=1000003;j++)
        	    {
        	    	if(vis[j]==false)
        	    	{
        	    		sum+=j;
        	    		break;
        	    	}
        	    }
        		
        	}
        	cout<<"Case "<<cnt<<": "<<sum<<" Xukha"<<endl;
        	cnt++;
        }
    	return 0;
    }

    二分+欧拉函数

    wa了,没找到错

    代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<map>
    #include<set>
    #include<vector>
    #include<cmath>
    
    const int maxn=1e6+5;
    typedef long long ll;
    using namespace std;
    
    struct node
    {
    	ll val,id;
    }p[maxn];
    int Eular(int n)
    {
    	int ans = n;
    	for (int i = 2 ; i * i <= n ; i++)
    	{
    		if (n % i == 0)
    		{
    			ans -= ans / i;
    			while (n % i == 0)
    				n /= i;
    		}
    	}
    	if (n > 1)
    		ans -= ans / n;
    	return ans;
    }
    bool cmp(node x,node y)
    {
    	if(x.val!=y.val)
    	{
    		return x.val<y.val;
    	}
    	else
    	{
    		return x.id<y.id;
    	}
    }
    
    int main()
    { 
    int cc=0;  
    for(int t=2;t<=1000003;t++)
    {
    	p[cc].val=Eular(t);
    	p[cc++].id=t;
    }
    sort(p,p+cc,cmp);
        int T;
        cin>>T;
        int n;
        int cnt=1;
        while(T--)
        {
        	cin>>n;
        	ll sum=0;
        	int x;
        	int l,r;
        	for(int t=0;t<n;t++)
        	{
        		scanf("%d",&x);
        		l=0;r=cc;
        		while(l<r)
        		{
        		    int mid=(l+r)>>1;
        		    if(p[mid].val<x)
        		    {
        		    	l=mid+1;
        		    }
        		    else
        		    {
        		    	r=mid;
        		    }
        		}
        		sum+=p[(l+r)>>1].id;
        		
        	}
        	cout<<"Case "<<cnt<<": "<<sum<<" Xukha"<<endl;
        	cnt++;
        }
    	
    	return 0;
    }
  • 相关阅读:
    Git在商业项目中的使用流程
    EventBus中观察者模式的应用
    作业三——安卓系统文件助手APP原型设计
    视频剪辑软件的调研——万兴神剪手、视频编辑王、爱剪辑
    18-10-31 Scrum Meeting 3
    myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)
    一个「学渣」从零开始的Web前端自学之路
    Vue一个案例引发「内容分发slot」的最全总结
    Vue CLI 3.0脚手架如何在本地配置mock数据
    Vue一个案例引发「动画」的使用总结
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781746.html
Copyright © 2020-2023  润新知