How to write a loop to display multiples of primes in Java? - java

My assignment reads:
Write a program that finds all of the prime numbers between one and some number that you allow the user to input.
Find the prime numbers between 0 and the number the user inputs.
Print these prime numbers, one per line.
After each prime number, add a colon and then print out all the non-prime numbers that were eliminated.
Basically, these non-prime numbers are the multiples of the primes.
For example, the output will look like this:
2: 4 6 8 10 12 14 16 18...
3: 9 15 21 27
I did prime numbers. I can not figure out how to calculate and display multiples? Help, please!
package assignment4;
import java.util.Scanner;
public class Assignment4 { /**
* #param args the command line arguments
*/
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
final int START = 1;
System.out.print("Enter the end number number : ");
int end = s.nextInt();
System.out.println("List of prime numbers between " + START + " and "
+ end);
for (int i = START; i <= end; i++) {
if (isPrime(i)) {
System.out.println(i + ":");
}
}
}
public static boolean isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i < Math.sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;}
}

I am assuming that you want to have print the multiples until the end number. You could nest a while loop that multiplies the prime number as follows:
for (int i = START; i <= end; i++) {
if (isPrime(i)) {
System.out.print(i + ": "); //Changed to print so that the multiples are on the same line
int multiple = i * 2;
while (multiple <= end) {
multiple += i;
System.out.print(multiple + ", ");
}
System.out.println("");
}
}

Displaying multiples would be easy if you were sieving using sieve of Erathrosthenes. You create an array of numbers from 2 to n. start with 2, mark non-prime all its multiples: 2 4 6... print them. Choose next prime number (i.e. the number which was not marked unprime) i.e. 3, mark non-prime all its multiples (which haven't been already): 9 15 ... and so on.
Simplest Solution:
boolean[] x = new boolean[N];// x[i] is true when i is not prime
for(int i=2;i<N;i++){
if(!x[i]){
System.out.print(i+" : ");
for(int j=i*i;j<N;j+=i){
if(!x[j])
System.out.print(j+" ");
x[j]=true;
}
System.out.println();
}
}

Please check below answer for your requirement,
package assignment4;
import java.util.*;
import java.lang.*;
import java.io.*;
public class Assignment4
{
public static List<Integer> primeNumbers = new ArrayList<>();
public static String strOtherData[];
public static void main (String[] args) throws java.lang.Exception
{
final int START = 1;
System.out.print("Enter the end number number : ");
int end = s.nextInt();
System.out.println("List of prime numbers between " + START + " and " + end);
for (int i = START; i <= end; i++) {
if (isPrime(i)) {
primeNumbers.add(i);
}
}
strOtherData = new String[primeNumbers.size()];
for (int i = START; i <= end; i++) {
isMultiple(i);
}
int tempCount = 0;
for(Integer currentNumber : primeNumbers)
{
System.out.print(currentNumber + ": \t");
if(strOtherData.length > tempCount)
{
System.out.print(strOtherData[tempCount] + "\n\n");
}
tempCount++;
}
}
public static boolean isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i <= n/2; i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
public static void isMultiple(int n)
{
if (n <= 1) {
return;
}
if(isPrime(n))
return;
int count = 0;
for(Integer currentInt : primeNumbers)
{
if(strOtherData[count] != null)
{
strOtherData[count] += "," + n;
}
else
{
strOtherData[count] = "" + n;
}
count++;
}
}
}

Related

Prime number check java

Write a program to read n numbers. The first number specified as input will be n. Next, the program should read n integer numbers.
The program should check for each number if it is prime as well as if its reverse is prime.
Display all such numbers in ascending order.
Consider below example for input and output:
Input:
7
11
12
23
19
7
113
101
Output:
7
11
101
113
My code
public class Prime {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int temp;
int[] a = new int [x];
int[] r = new int [x];
int[]c = new int[a.length+r.length];
int[] rev = new int [x];
for(int i=0;i<x;i++){
a[i] = sc.nextInt();
rev[i]=a[i];
}
for(int i = 0; i < a.length; i++) {
while(rev[i] != 0) {
r[i] = r[i] * 10;
r[i] = r[i] + rev[i]%10;
rev[i] = rev[i]/10;
}
}
for(int i = 0; i < a.length; i++) {
boolean isPrime = true;
for (int j = 2; j < i; j++) {
if((a[i]%j==0) || (r[i]%j==0)) {
isPrime = false;
break;
}
}
if(isPrime)
System.out.println(a[i]);
System.out.println(r[i]);
}
}
}
Somewhere I am stuck I don't know how to eliminate repeated no, how to merge the array at last and also it is printing 1 and 2 as prime no when I give input and 2
You need to use TreeSet - which will contain only distinct elements and give result in sorted form. You can refer to following code-
Set<Integer> set = new TreeSet<>();
for(int i = 0; i < a.length; i++) {
boolean isPrime = true;
if(isPrime(a[i]) && isPrime(r[i]))
set.add(a[i]);
}
Iterator it = set.iterator();
while(it.hasNext())
System.out.print(it.next() + " ");
Also create a function for checking prime numbers -
private static boolean isPrime(int num) {
if(num==1) return false;
for(int i = 2; i <= num/2; ++i)
{
if(num % i == 0)
{
return false;
}
}
return true;
}
You can try below code. Hope it helps you,
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class PrimeNumberTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(7, 11, 12, 23, 19, 7 ,113, 101));
//To remove duplicates
Set<Integer> set = new TreeSet<>(list);
System.out.println(getPrimeNumbers(set).toString().replaceAll(",", "").replace("]", "").replace("[", ""));
}
//Method to get unique ordered set of prime numbers
private static Set<Integer> getPrimeNumbers(Set<Integer> set) {
Set<Integer> resultList=new TreeSet<>();
set.forEach(ele->{
//check for prime
if(isPrime(ele)){
//if prime number check for reverse and if true, add to result
if(isPrime(reverserNumb(ele)))
resultList.add(ele);
}
});
return resultList;
}
private static boolean isPrime(int num){
if(num<2)
return false;
// Check for even numbers
if (num % 2 == 0) {
return num == 2;
}
// Check for odd numbers
for (int i = 3; i*i <= num; i += 2) {
if (num % i == 0) {
return false;
}
}
return true;
}
private static int reverserNumb(int num) {
return Integer.valueOf(new StringBuilder(String.valueOf(num)).reverse().toString());
}
}
Here is the code for prime test using √n approach
static boolean isPrime(int n){
//corner case
if (n <= 1) return false;
if (n <= 3) return true;
//middle 5 number
if (n % 2 == 0 || n % 3 == 0) return false;
for (int i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return false;
return true;
}
Use can use set for remove duplicate element
Try if this code works, hope it helps
Code:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class PrimeNumbers {
static ArrayList<Integer> prime = new ArrayList<>();
public static void main(String[] args) {
Scanner user_input = new Scanner(System.in);
System.out.print("Enter Number of Integers: ");
int number_count = user_input.nextInt();
int[] numbers = new int[number_count];
for (int i = 0; i < numbers.length; i++) {
System.out.print("Enter Integer: ");
numbers[i] = user_input.nextInt();
}
System.out.print("Values Entered: ");
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i] + " ");
checkPrime(numbers[i],false); //false don't reverse
checkPrime(numbers[i],true); //true reverse value to check if it is also prime
}
System.out.print("\nList of prime numbers: ");
Collections.sort(prime);
for(int n : prime){
System.out.print(n + " ");
}
if(prime.isEmpty()){
System.out.print("no prime numbers on list\n");
}
}
//check for duplicates
static void insertValueToPrime(int n){
for(int p : prime){
if(n == p){
return;
}
}
prime.add(n);
}
static void checkPrime(int n,boolean isReverse) {
int i, m = 0, flag = 0,realn = n;
if(isReverse){
n = reverseNumber(n);
}
m = n / 2;
if (n == 0 || n == 1) {
//no a prime number
} else {
for (i = 2; i <= m; i++) {
if (n % i == 0) {
// not a prime number
flag = 1;
break;
}
}
if (flag == 0) {
insertValueToPrime(realn);
}
}
}
static int reverseNumber(int n){
String reverse = "",str=""+n;
for(int i = str.length() - 1; i >= 0; i--)
{
reverse = reverse + str.charAt(i);
}
return Integer.parseInt(reverse);
}
}

ADAGAME4 Spoj Wrong Answer

Below is a Archive PROBLEM from SPOJ. Sample testCase is passing, but I am getting W/A on submission. I am missing some testCase(testCases). Need help to figure out what case I am missing and/or what I am doing wrong here.
Ada the Ladybug is playing Game of Divisors against her friend Velvet Mite Vinit. The game has following rules. There is a pile of N stones between them. The player who's on move can pick at least 1 an at most σ(N) stones (where σ(N) stands for number of divisors of N). Obviously, N changes after each move. The one who won't get any stones (N == 0) loses.
As Ada the Ladybug is a lady, so she moves first. Can you decide who will be the winner? Assume that both players play optimally.
Input
The first line of input will contain 1 ≤ T ≤ 10^5, the number of test-cases.
The next T lines will contain 1 ≤ N ≤ 2*10^7, the number of stones which are initially in pile.
Output
Output the name of winner, so either "Ada" or "Vinit".
Sample Input:
8
1
3
5
6
11
1000001
1000000
29
Sample Output:
Ada
Vinit
Ada
Ada
Vinit
Vinit
Ada
Ada
CODE
import java.io.*;
public class Main
{
public static int max_size = 2 * (int)Math.pow(10,7) + 1;
//public static int max_size = 25;
//public static int max_size = 2 * (int)Math.pow(10,6) + 1;
public static boolean[] dp = new boolean[max_size];
public static int[] lastPrimeDivisor = new int[max_size];
public static int[] numOfDivisors = new int[max_size];
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
preprocess();
int t = Integer.parseInt(br.readLine());
while(t > 0)
{
int n = Integer.parseInt(br.readLine());
if(dp[n] == true)
System.out.println("Ada");
else
System.out.println("Vinit");
t--;
}
}
public static void markLastPrimeDivisor()
{
for(int i = 0 ; i < max_size ; i++)
{
lastPrimeDivisor[i] = 1;
}
for(int i = 2 ; i < max_size ; i += 2)
{
lastPrimeDivisor[i] = 2;
}
int o = (int)Math.sqrt(max_size);
for(int i = 3 ; i < max_size; i++)
{
if(lastPrimeDivisor[i] != 1)
{
continue;
}
lastPrimeDivisor[i] = i;
if(i <= o)
{
for(int j = i * i ; j < max_size ; j += 2 * i)
{
lastPrimeDivisor[j] = i;
}
}
}
/*for(int i = 1 ; i < max_size ; i++)
System.out.println("last prime of " + i + " is " + lastPrimeDivisor[i]);*/
}
public static void countDivisors(int num)
{
int original = num;
int result = 1;
int currDivisorCount = 1;
int currDivisor = lastPrimeDivisor[num];
int nextDivisor;
while(currDivisor != 1)
{
num = num / currDivisor;
nextDivisor = lastPrimeDivisor[num];
if(nextDivisor == currDivisor)
{
currDivisorCount++;
}
else
{
result = result * (currDivisorCount + 1);
currDivisorCount = 1;
currDivisor = nextDivisor;
}
}
if(num != 1)
{
result = result * (currDivisorCount + 1);
}
//System.out.println("result for num : " + original + ", " + result);
numOfDivisors[original] = result;
}
public static void countAllDivisors()
{
markLastPrimeDivisor();
for(int i = 2 ; i < max_size ; i++)
{
countDivisors(i);
//System.out.println("num of divisors of " + i + " = " + numOfDivisors[i]);
}
}
public static void preprocess()
{
countAllDivisors();
dp[0] = dp[1] = dp[2] = true;
for(int i = 3 ; i < max_size ; i++)
{
int flag = 0;
int limit = numOfDivisors[i];
//If for any i - j, we get false,for playing optimally
//the current opponent will choose to take j stones out of the
//pile as for i - j stones, the other player is not winning.
for(int j = 1 ; j <= limit; j++)
{
if(dp[i - j] == false)
{
dp[i] = true;
flag = 1;
break;
}
}
if(flag == 0)
dp[i] = false;
}
}
}
There is a subtle bug in your countDivisors() function. It assumes
that lastPrimeDivisor[num] – as the name indicates – returns the
largest prime factor of the given argument.
However, that is not the case. For example, lastPrimeDivisor[num] = 2
for all even numbers, or lastPrimeDivisor[7 * 89] = 7.
The reason is that in
public static void markLastPrimeDivisor()
{
// ...
for(int i = 3 ; i < max_size; i++)
{
// ...
if(i <= o)
{
for(int j = i * i ; j < max_size ; j += 2 * i)
{
lastPrimeDivisor[j] = i;
}
}
}
}
only array elements starting at i * i are updated.
So lastPrimeDivisor[num] is in fact some prime divisor of num, but not
necessarily the largest. As a consequence, numOfDivisors[55447] is computed
as 8 instead of the correct value 6.
Therefore in countDivisors(), the exponent of a prime factor in num
must be determined explicitly by repeated division.
Then you can use that the divisors function is multiplicative. This leads to
the following implementation:
public static void countAllDivisors() {
// Fill the `somePrimeDivisor` array:
computePrimeDivisors();
numOfDivisors[1] = 1;
for (int num = 2 ; num < max_size ; num++) {
int divisor = somePrimeDivisor[num];
if (divisor == num) {
// `num` is a prime
numOfDivisors[num] = 2;
} else {
int n = num / divisor;
int count = 1;
while (n % divisor == 0) {
count++;
n /= divisor;
}
// `divisor^count` contributes to `count + 1` in the number of divisors,
// now use multiplicative property:
numOfDivisors[num] = (count + 1) * numOfDivisors[n];
}
}
}

java unable to find the error to print a prime number

This program gets 4 input from the user and prints out all the pairs except for the duplicate pairs. I wanted it print only the pairs that sum equals a prime number. I did the entire program there is no compilation error but in the output it prints to all pairs except the duplicate pair(i want it to print only the pair whose sum= a prime number) can anyone tell me what i am doing wrong
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Prime {
public static List<Integer> numbers = new ArrayList<>(); // a list of integers that was accepted, can be acced in the order they were added
public static Scanner input = new Scanner(System.in);
public static void main(String args[])
{
int inputs = 4;
input(inputs);
for(int i = 0; i < inputs; i++){
for(int j = 0+i; j < inputs; j++){
if(i != j)
System.out.println(numbers.get(i)+ " + " + numbers.get(j) + " = "+ isPrime(numbers.get(i) + numbers.get(j)));
}
} }
public static int isPrime (int sumPair)
{
boolean primeVal =true ;
if(sumPair < 2)
primeVal= false;
else if(sumPair ==2)
primeVal=true;
else if (sumPair % 2 == 0)
primeVal = false;
else
{
int stop = (int)Math.sqrt(sumPair);
for (int d = 3; d <= stop && primeVal; d = d + 2)
{
if (sumPair % d == 0)
primeVal = false;
}
}
return(sumPair);
}
public static void input(int inputNumbers)
{
while(numbers.size() < inputNumbers){ // while there is more inputs needed
System.out.print("Enter a positive integer: ");
int num = input.nextInt();
if(num > 0) // if the input is valid
numbers.add(num);
else // if the input is not valid
while (num <= 0) { // while the input is not valid
System.out.print("Enter a positive integer: ");
num = input.nextInt(); // get the next int if it wasn't valid
if(num > 0) { // if the input gets valid
numbers.add(num);
}
}
System.out.println("Thank you.");
}
}
public static int sumPair(int num1, int num2)
{
return num1 + num2;
}
}
You go to a lot of trouble to compute a boolean primeVal which tells whether the input be true or false, but you never actually return this value. Try this instead:
public static boolean isPrime (int sumPair) {
boolean primeVal = true;
if (sumPair < 2 || sumPair % 2 == 0) {
primeVal = false;
}
else {
int stop = (int)Math.sqrt(sumPair);
for (int d=3; d <= stop; d += 2) {
if (sumPair % d == 0) {
primeVal = false;
break;
}
}
}
return primeVal;
}
Use this main() method:
public static void main (String args[]) {
int inputs = 4;
input(inputs);
for (int i=0; i < inputs-1; i++) {
for (int j=i+1; j < inputs; j++) {
boolean prime = isPrime(numbers.get(i) + numbers.get(j));
if (prime) {
System.out.println(numbers.get(i) + " + " + numbers.get(j));
}
}
}
}
Your condition to determine if you print the current pair or not is if(i != j), so it will only print if i is different from j (duplicate).
You made a nice isPrime function, you should call it.
You made your isPrime function return an int, and I'm pretty sure it should return a boolean instead. Also, it returns the argument you gave it, so it does virtually nothing except spend time in a potentially expensive operation. Perhaps should it return primeVal instead.
Your code should look like:
for(int i = 0; i < inputs; i++){
for(int j = 0+i; j < inputs; j++){
ni = numbers.get(i);
nj = numbers.get(j);
if(isPrime(ni+nj)){
System.out.println(ni + " + " + nj + " = "+ (ni + nj));
}
}
}
What this does is get the numbers for indexes i and j and store them in ni and nj respectively. Then, it checks it their sum is prime. If it is, then it prints the sum.

isItPrime using a boolean method? So Close

I feel I am so close! The output is just outputting true true true or false false false (depending on the length of the array and the user inputs.
I feel this is because of the if/else! For instance, if the number you input first is either true or false it makes all of them that!?
This is supposed to print to the console the numbers in the array, the index of the array numbers, and whether they are prime or not, individually.
Thanks for the help!!
import java.util.Scanner;
import java.util.Arrays;
public class isItPrime {
//main method
public static void main (String[] args) {
//Scanner
Scanner input = new Scanner(System.in);
System.out.println("Enter length of array: ");
int n = input.nextInt();
int[] numbers = new int[n];
System.out.println("Enter " + n +" integers to fill the array: ");
for(int i=0; i<n; i++){
numbers[i] = input.nextInt();
}
System.out.println(Arrays.toString(numbers));
for(int j=0; j<n; j++){
System.out.println(numbers[j] + ": " + j + " -- " + isPrime(numbers));
}
}
public static boolean isPrime(int[] numbers){
boolean Prime = true; //initial boolean value
for (int i = 2; i<numbers.length; i++) {
for (int j=0; j<numbers.length; j++) {
if (numbers[j] == 1 || numbers[j] == 0) {
Prime = false;
}
else if (numbers[j]%i==0){ //function which determines if an int is prime.
Prime = false;
}
else {
Prime = true;
}
}
}
return Prime;
}
}
This is what you need:
public class IsItPrime{
//main method
public static void main(String[] args) {
//Scanner
Scanner input = new Scanner(System.in);
System.out.println("Enter length of array: ");
int n = input.nextInt();
int[] numbers = new int[n];
System.out.println("Enter " + n + " integers to fill the array: ");
for (int i = 0; i < n; i++) {
numbers[i] = input.nextInt();
}
System.out.println(Arrays.toString(numbers));
for (int j = 0; j < n; j++) {
System.out.println(numbers[j] + ": " + j + " -- " + isPrime(numbers[j]));
}
}
public static boolean isPrime(int numbers) {
boolean Prime = true;
if (numbers == 1 || numbers == 0) {
Prime = false;
return Prime;
}
for (int i = 2; i < numbers; i++) {
if (numbers % i == 0) {
Prime = false;
return Prime;
} else {
Prime = true;
}
}
return Prime;
}
}
Only a single integer needs to be passed to the isPrime function.
Also, for processing this integer only a single loop would suffice in the isPrime function.
I have made the required changes.
Assuming you want to return which elements are prime:
public static boolean isPrime(int[] numbers){
boolean prime[] = new boolean[numbers.length]; //initial boolean value
for (int i = 0; i<numbers.length; i++) {
for (int j=2; j<=sqrt(numbers[i]); j++) {
if (numbers[j]%i==0){ //function which determines if an int is prime.
prime[i] = false;
continue;
}
}
prime[i] = true
}
return prime;
}
I'm creating a prime array and whichever is prime, I'm making its position in the array true, and i continue with the next element.
Also, for prime, you have to check until square root of the number for the sake of efficiency.
For example, if you want to check if 10 is prime, it is better to iterate until sqrt(10)=3.2.
Your biggest problem is your isPrime() method should calculate if a particular number is prime, not analyse an array of numbers.
Try this:
public static boolean isPrime(int number){
// return true if prime
}
And call it like this:
System.out.println(numbers[j] + ": " + j + " -- " + isPrime(number[j]));
Altered method to return string i.e, "Prime" or "Not Prime".
public static String isPrime(int numbers) {
if (numbers == 1 || numbers == 0) {
return "Not Prime";
}
for (int i = 2; i < numbers; i++) {
if (numbers % i == 0) {
return "Not Prime";
}
}
return "Prime";
}

sexy primes specific printing and tally

OK so the code I have is good, But instead of just displaying primes I need it to display the pairs that match and how many pairs there are, I know that this probably needs to go into the process sieve, I am summing I am going to need a tally system, and But I do not understand how to put them into pairs for printing out.
This is how they are supposed to printed out
Here are all of the sexy prime pairs in the range 1 to 42, one pair per line:
5 and 11
7 and 13
11 and 17
13 and 19
17 and 23
23 and 29
31 and 37
There were 7 sexy prime pairs displayed.
import java.util.Scanner;
public class aleko_Sieve
{
Scanner in = new Scanner(System.in);
boolean primes [] = new boolean [50001];
int upperbnd;
int lowerbnd;
public aleko_Sieve ()
{
primes[0] = false;
primes[1] = false;
for (int i = 2; i < primes.length; i++)
{
primes[i] = true;
}
getLower();
getUpper();
processSieve();
showPrimes();
}
public void processSieve()
{
for (int i =2; (i * i) <= upperbnd; i++)
{
for (int j = (i * i); j <= upperbnd; j = j + i)
{
primes[j] = false;
}
}
}
public void getLower()
{
int x=0;
do
{
System.out.println("Please enter a lower boundary ( 1 - 50000): ");
lowerbnd = in.nextInt();
if (( lowerbnd < 1) || (lowerbnd > 50000))
{
System.out.println("Please enter a valid number");
x = 1;
}
if (( lowerbnd > 1) || (lowerbnd < 50000))
{
x = 0;
}
}
while ( x == 1);
}
public void getUpper()
{
int x=0;
do
{
System.out.println("Please enter a upper boundary ( 1 - 50000): ");
upperbnd = in.nextInt();
if (( upperbnd < 1) || (upperbnd > 50000))
{
System.out.println("Please enter a valid number");
x = 1;
}
if (( upperbnd > 1) || (upperbnd < 50000))
{
x = 0;
}
}
while ( x == 1);
}
public void showPrimes()
{
for (int i = 2; i < upperbnd; i++)
{
if (primes[i] == true)
{
System.out.println( i + " is prime");
}
}
}
public static void main (String args[])
{
aleko_Sieve p = new aleko_Sieve();
}
}
When you go to print a prime, see if the index 6 lower than the current one you just found is a prime and print them both.
//if found prime
if (i > 6)
{
if (prime[i-7]==true)
//print both primes
}
You can loop over your array of primes as follows:
public void showSexy()
{
int countPairs = 0;
System.out.println("Here are all of the sexy prime pairs in the range 1 to 42, one pair per line:");
for (int i = 2; i < upperbnd - 6; i++)
{
if (primes[i] == true && primes[i+6]== true)
{
countPairs++;
System.out.println( i + " and " + (i+6));
}
}
System.out.println("There were " + countPairs + " sexy prime pairs displayed");
}
Couple of things to note:
the loop has an upper bound of upperbnd - 6 since otherwise you can't find another prime that is 6 greater
Create a countPairs variable that is incremented each time a pair is found
Print the pair when you find it (you already have the array with true/false so it's easy to find them)
Print the count of pairs after you have gone through the entire list

Categories

Resources