ETF - Euler Totient Function - SPOJ Solution C++

  Problem Link : ETF 


👉 Hint : Precompute smallest prime factor for every number in range

 


✅ C++ Solution :

 
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define si 1000000
int main() {
	int t;
	ll n;
	ll i,j;
	ll a[si+1];
	for(i=1;i<=si;i++)
		a[i]=i;
	for(i=2;i*i<=si;i++)
	{
		if(a[i]==i)
		{
			for(j=i*i;j<=si;j+=i)
			{
				if(a[j]==j)
					a[j]=i;
			}
		}
	}
	cin>>t;
	while(t--)
	{
		cin>>n;
		set<int>s;
		set<int>:: iterator it;
		int ans=n;
		while(n!=1)
		{
			s.insert(a[n]);
			n/=a[n];
		}
		for(it=s.begin();it!=s.end();it++)
		{
			ans*=(1.0-1.0/((float)*it));
		}
		cout<<ans<<endl;
	}
	return 0;
}

 

Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook. 

😇Happy Learning!!