You are given an integer number n. The following algorithm is applied to it:

  1. if n = 0, then end algorithm; 
  2. find the smallest prime divisor d of n; 
  3. subtract d from n and go to step 1. 



Determine the number of subtrations the algorithm will make.

Input

The only line contains a single integer n (2 ≤ n ≤ 10^{10}).

Output

Print a single integer — the number of subtractions the algorithm will make.

Examples

Input


5


Output


1


Input


4


Output


2

Note

In the first example 5 is the smallest prime divisor, thus it gets subtracted right away to make a 0.

In the second example 2 is the smallest prime divisor at both steps.
import java.io.*;
import java.math.*;
import java.security.KeyStore.Entry;
import java.util.*;
/* 
																yash jobanputra
																	DA-IICT
*/
public class yash {
	private static InputStream stream;
	private static byte[] buf = new byte[1024];
	private static int curChar;
	private static int numChars;
	private static SpaceCharFilter filter;
	private static PrintWriter pw;
	private static long mod = 1000000000 + 7;
	private static long mod1 = 1000000000 + 9;
	private static int MAX=1000001;
	private static int block;
	private static int[] cost;
	private static int times;
	private static boolean[] vis;
	private static void soln(){
		int n=ni();
		int sn=(int) Math.sqrt(n);
		ArrayList<Integer> arr=new ArrayList<>();
		boolean[] b=new boolean[sn+1];
		Arrays.fill(b, true);
		for(int i=2;i<=sn;i++)
		{
			if(b[i])
			{
				for(int j=2;j*i<=sn;j++)
				{
					b[j*i]=false;
				}
				arr.add(i);
			}
		}
		//pw.println(arr.toString());
		int cur=n;int ans=0;
		while(cur>0)
		{
			if(cur%2==0)
			{
				ans+=cur/2;
				break;
			}
			ans++;
			boolean flag=false;
			for(int i=0;i<arr.size();i++)
			{
				if(cur%arr.get(i)==0)
				{
					cur-=arr.get(i);
					flag=true;
					break;
				}
			}
			if(!flag)
			{
				break;
			}
			
		}
		pw.println(ans);
		
	}	
	public static class segtree{ 
		static int[] tree=new int[10000000];
		static int[] lazy=new int[10000000];
		public static void initial()
		{
			Arrays.fill(lazy, 0);
		}
		public static void build(int[] arr,int node,int l,int r)
		{
			if(l==r)
			{
				tree[node]=arr[l];
			}
			else
			{
				int m=(l+r)/2;
				build(arr,(2*node)+1,l,m);
				build(arr,(2*node)+2,m+1,r);
				tree[node]=tree[2*node+1]+tree[(2*node)+2];
			}
		}
		public static void updater(int[] arr,int node,int l,int r,int s,int e,int val)
		{
			if(lazy[node]!=0)
			{
				tree[node]+=(r-l+1)*lazy[node];
				if(l!=r)
				{
					lazy[2*node+1]+=lazy[node];
					lazy[2*node+2]+=lazy[node];
				}
				lazy[node]=0;
			}
			if(s<=l && e>=r)
			{
				tree[node]+=(r-l+1)*val;
				if(l!=r)
				{
					lazy[2*node+1]+=val;
					lazy[2*node+2]+=val;
				}
			}
			else if(!(e<l || r<s))
			{
				int m=(l+r)/2;
				updater(arr,2*node+1,l,m,s,e,val);
				updater(arr,2*node+2,m+1,r,s,e,val);
				tree[node]=tree[2*node+1]+tree[2*node+2];
			}
		}
		public static void update(int[] arr,int node,int l,int r,int ind,int val)
		{
			if(l==r)
			{
				arr[ind]+=val;
				tree[node]+=val;
			}
			else
			{
				int m=(l+r)/2;
				if(l<=ind && ind<=m)
				{
					update(arr,(2*node+1),l,m,ind,val);
				}
				else
				{
					update(arr,(2*node+2),m+1,r,ind,val);
				}
				tree[node]=tree[2*node+1]+tree[2*node+2];
			}
		}
		public static int query(int node,int l,int r,int s,int e)
		{
			if(lazy[node]!=0)
			{
				tree[node]+=(r-l+1)*lazy[node];
				if(l!=r)
				{
					lazy[2*node+1]+=lazy[node];
					lazy[2*node+2]+=lazy[node];
				}
				lazy[node]=0;
			}
			if(e<l || r<s)
				return 0;
			if(s<=l && e>=r)
				return tree[node];
			int m=(l+r)/2;
			int p1=query((2*node+1),l,m,s,e);
			int p2=query((2*node+2),m+1,r,s,e);
			return (p1+p2);
		}
	}
	public static long f(int number) {
	      if (number <= 1) return 1;
	      else return number * f(number - 1);
	   }
	public static void dfs(ArrayList<Integer>[] gr,int v)
	{
		vis[v]=true;
		ArrayList<Integer> arr=gr[v];
		for(int i=0;i<arr.size();i++)
		{
			if(!vis[arr.get(i)])
			{
				times++;
				dfs(gr,arr.get(i));
			}	
		}
		
	}
	private static class Pair implements Comparable<Pair>{
		int v,i,k;Pair j;
		public Pair(int a,int b){
			v=a;
			i=b;
		}
		@Override
		public int compareTo(Pair arg0) {
			{
				return this.v-arg0.v;
			}
		}
	}
	private static long pow(long a, long b, long c) {
		if (b == 0)
			return 1;
		long p = pow(a, b / 2, c);
		p = (p * p) % c;
		return (b % 2 == 0) ? p : (a * p) % c;
	}
	private static long gcd(long n, long l) {
		if (l == 0)
			return n;
		return gcd(l, n % l);
	}
	private static int gcd(int n, int l) {
		if (l == 0)
			return n;
		return gcd(l, n % l);
	}
	private static long max(long a, long b) {
		if (a > b)
			return a;
		return b;
	}

	private static long min(long a, long b) {
		if (a < b)
			return a;
		return b;
	}

	public static void main(String[] args) throws Exception {
		new Thread(null,new Runnable(){
			@Override
			public void run() {
				/*try {
					InputReader(new FileInputStream("C:\\Users\\hardik\\Desktop\\C-small-1-attempt1.in"));
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}*/
				InputReader(System.in);
				pw = new PrintWriter(System.out);
				/*try {
					pw=new PrintWriter(new FileOutputStream("C:\\Users\\hardik\\Desktop\\out.txt"));
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}*/
				soln();
				pw.close();
			}
		},"1",1<<26).start();
	}

	public static void InputReader(InputStream stream1) {
		stream = stream1;
	}

	private static boolean isWhitespace(int c) {
		return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
	}

	private static boolean isEndOfLine(int c) {
		return c == '\n' || c == '\r' || c == -1;
	}

	private static int read() {
		if (numChars == -1)
			throw new InputMismatchException();
		if (curChar >= numChars) {
			curChar = 0;
			try {
				numChars = stream.read(buf);
			} catch (IOException e) {
				throw new InputMismatchException();
			}
			if (numChars <= 0)
				return -1;
		}
		return buf[curChar++];
	}

	private static int ni() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		int sgn = 1;
		if (c == '-') {
			sgn = -1;
			c = read();
		}
		int res = 0;
		do {
			if (c < '0' || c > '9')
				throw new InputMismatchException();
			res *= 10;
			res += c - '0';
			c = read();
		} while (!isSpaceChar(c));
		return res * sgn;
	}

	private static long nl() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		int sgn = 1;
		if (c == '-') {
			sgn = -1;
			c = read();
		}
		long res = 0;
		do {
			if (c < '0' || c > '9')
				throw new InputMismatchException();
			res *= 10;
			res += c - '0';
			c = read();
		} while (!isSpaceChar(c));
		return res * sgn;
	}
	private static double nd()
    {
        double ret = 0, div = 1;
        int c = read();
        while (c <= ' ')
            c = read();
        boolean neg = (c == '-');
        if (neg)
            c = read();

        do {
            ret = ret * 10 + c - '0';
        }
        while ((c = read()) >= '0' && c <= '9');

        if (c == '.')
        {
            while ((c = read()) >= '0' && c <= '9')
            {
                ret += (c - '0') / (div *= 10);
            }
        }

        if (neg)
            return -ret;
        return ret;
    }
	private static String nextToken() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		StringBuilder res = new StringBuilder();
		do {
			res.appendCodePoint(c);
			c = read();
		} while (!isSpaceChar(c));
		return res.toString();
	}

	private static String nli() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		StringBuilder res = new StringBuilder();
		do {
			res.appendCodePoint(c);
			c = read();
		} while (!isEndOfLine(c));
		return res.toString();
	}
	
	private static int[] nia(int n) {
		int[] arr = new int[n];
		for (int i = 0; i < n; i++) {
			arr[i] = ni();
		}
		return arr;
	}

	private static long[] nla(int n) {
		long[] arr = new long[n];
		for (int i = 0; i < n; i++) {
			arr[i] = nl();
		}
		return arr;
	}

	private static void pa(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			pw.print(arr[i] + " ");
		}
		pw.println();
		return;
	}

	private static void pa(long[] arr) {
		for (int i = 0; i < arr.length; i++) {
			pw.print(arr[i] + " ");
		}
		pw.println();
		return;
	}

	private static boolean isSpaceChar(int c) {
		if (filter != null)
			return filter.isSpaceChar(c);
		return isWhitespace(c);
	}
	private static char nc() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		char c1=(char)c;
		while(!isSpaceChar(c))
			c=read();
		return c1;
	}
	public String ns() {
        int c = read();
        while (isSpaceChar(c))
            c = read();
        StringBuilder res = new StringBuilder();
        do {
            res.appendCodePoint(c);
            c = read();
        } while (!isSpaceChar(c));
        return res.toString();
    }
	private interface SpaceCharFilter {
		public boolean isSpaceChar(int ch);
	}
}