import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;



public class Main {

	
	private static Scanner in = new Scanner(System.in);
	 

	public static void main(String[] args) {
		
		int n = in.nextInt();
		
		int [] fib = fibonacci(15);
		
		StringBuilder sb = new StringBuilder();
		
		for (int i = 1; i <=n; i++) {
			if(Arrays.binarySearch(fib, i)>=0) {
				sb.append("O");
			} else {
				sb.append("o");
			}
		}
		System.out.println(sb);
		
		
		
		
	} static boolean isSquare(int n) {
		return (int)Math.sqrt(n)==Math.sqrt(n);
	}
	static int [] fibonacci(int n) {
		int [] f = new int[n];
		f[0]=1;
		f[1]=1;
		
		for (int i = 2; i < f.length; i++) {
			f[i]=f[i-1]+f[i-2];
		}
		
		return f;
	}
	static long fact(long n) {
		if(n<=1) return 1;
		else return n*fact(n-1);
	}
	static void closeLeft(int [] a , int l) {
		for (int i = 0; i < l; i++) {
			a[i]=1;
		}
	}
	static void closeRight (int [] a, int r) {
		for (int i = r+1; i < a.length; i++) {
			a[i]=1;
		}
	}
	static boolean isFinish(int [] a) {
		
		int num = 0;
		
		for (int i = 0; i < a.length; i++) {
			if(a[i]==-1 || a[i]==1) num++;
		}

		return num==a.length;
	}
	
	static int findAPeak(int [] a) {
		
		int n = a.length;
		
		int lo = 0;
		int hi = n-1;
		
		while(lo<=hi) {
			
			int mid = lo+(hi-lo)/2;
			if(a[mid]<a[mid-1]) hi = mid-1;
			else if(a[mid]<a[mid+1]) lo=mid+1;
			else return mid;
			
		}	
		
		
		return -1;
	}
	 static HashMap<String, ArrayList<String>> solve(HashMap<String, String []> map) {
		
		boolean flag = false;
		 
		HashMap<String, ArrayList<String>> ans = new HashMap<>();
		
		for (Map.Entry<String, String []> m : map.entrySet()) {
			String [] ss = m.getValue();
			for (int i = 0; i < ss.length; i++) {
				for (int j = i+1; j < ss.length; j++) {
					if(ss[j].endsWith(ss[i]))  {
						flag = true;
						break;
					}					
				}
				if(!flag) {
				//	ans.put(m.getKey(), value)
				}
			}
		}
		
		return null;
	}
	
	static void fillAnArray(long [] a) {
		for (int i = 0; i < a.length - 1; i++) {
			a[i]=in.nextLong();
		}
	}
	static int []  shuffleAnArray(int [] a) {
		
		for (int i = 0; i < a.length; i++) {
			int index = (int)(Math.random()*a.length);
			int temp = a[i];
			a[i]=a[index];
			a[index]=temp;			
		}
				
		return a;
		
	}
	static int gcd(int a,int b) {
		return a==0 ? b : gcd(b%a,a);
	}
	
	static boolean eulerFunction(int n, int k) {
		return gcd(n,k)==1;
	}
	static String operate(String S, int l,int r,char o,char n) {
		
		String ss = "";
		
		for (int i = 0; i < S.length() ; i++) {
			
			if(i>=l-1 && i<=r-1) {
				
				if(S.charAt(i)== o) {
					ss+=n;
				}
				
				else {
					ss+=S.charAt(i);
				}
			}
			else {
				ss+=S.charAt(i);
			}
		}
		
		return ss;
	}
	static int sumOfArray(int [] a) {
		int sum = 0;
		for (int i = 0; i < a.length; i++) 
			if(a[i]>0)sum+=a[i];			
		return sum;
	}
	
	private static long convert(int i) {
		long res = i;
		while(i>0){
			int lastNum = i % 10;
			res = res * 10 + lastNum;
			i /=10;
		}
		
		return res;
	}

	static int numberOfElementsAboveZero(int [] a) {
		int num = 0;
		for (int i = 0; i < a.length; i++) {
			if(a[i]>0) num++;
		}		
		return num;
	}
	static int min(int [] a) {
		int min = Integer.MAX_VALUE;
		for (int i = 0; i < a.length; i++) {
			if(a[i]>0 && a[i]<min) {
				min=a[i];
			}
		}
		return min;
	}
	static void dis(int [] a ,int min) {
		for (int i = 0; i < a.length; i++) {
			a[i]-=min;
		}
	}
	static boolean isPrime(int n) {
		
		if(n < 2) return false;
		
		for (int i = 2; i <= (int)Math.sqrt(n); i++) 
			if(n%i==0) return false;
			return true;
		
	}

}
