이 페이지는 코딩도장 데이터의 읽기 전용 정적 보관본입니다.

상품 is 뭔들 (2016 인하대 프로그래밍 경진대회 B번)

출처: https://www.acmicpc.net/problem/12779

정보통신처에서는 2016년 6월 4일 인하 광장에서 이벤트를 진행하려고 한다. 정보통신처에서 인하 광장에 올린 게시글에 N번째로 댓글을 단 모든 학생에게 상품을 지급하기로 하였다. 단, N은 약수의 개수가 홀수여야 한다. 인하 광장을 즐겨보는 찬미는 이 이벤트에 참가하기로 하였다. 찬미는 댓글을 작성한 후 자신이 상품을 받을 확률이 얼마나 되는지 궁금해졌다. 찬미가 댓글을 작성하기 전의 총 댓글 수가 a개이고, 댓글을 작성 후의 총 댓글 수가 b개일 때 찬미의 댓글은 a보다 크고 b보다 작거나 같은 범위 안에 존재한다고 한다. 예를 들어 a가 1이고, b가 4인 경우 [2, 3, 4] 중 한 곳에 댓글이 존재한다. 이 중 약수의 개수가 홀수인 숫자는 4, 한 개이므로 상품을 받을 확률은 1/3이다. 찬미를 도와 찬미가 상품을 받을 확률을 구하는 프로그램을 작성하라.

입력

입력의 첫 줄에는 정수 a와 b가 주어진다. (1 ≤ a, b ≤ 2^60) b는 a보다 항상 크다

출력

찬미가 상품을 지급받을 확률을 기약분수 형태로 출력한다. 만약 확률이 0인 경우 0을 출력한다.

예제 입력

1 4

예제 출력

1/3
수학 유클리드 호제법

2016/06/02 15:54

iljimae

64개의 풀이가 있습니다.

a,b의 범위가 굉장히 크기 때문에 전체 탐색으로 해결할 수 없습니다. 우선 어떠한 수가 홀수개의 약수만을 갖기위해선 그 수는 완전제곱수여야합니다. 그리고 [a,b]에서 a를 포함하지 않는 완전제곱수의 개수는 sqrt(b)-sqrt(a)입니다. 따라서 우리가 찾는 답은 c/d (c = sqrt(b)-sqrt(a), d = b-a) 입니다.이 분수를 기약분수로 만들기 위해서 분모와 분자를 분모와 분자의 최대공약수로 나누어주면 됩니다. 아래는 C++ 코드입니다.

#include <iostream> 
#include <cstdlib> 
#include <cstdio> 
#include <cmath> 
#include <algorithm> 
using namespace std;

typedef long long ll;  

ll gcd(ll a,ll b){
    if (b == 0) return a; 
    return gcd(b,a%b); 
}

int main(){
    ll a,b; 
    cin >> a >> b;  
    ll d = b-a;  
    ll c = int(sqrt(b))-int(sqrt(a)); // 범위안에 약수의 개수가 홀수인 수의 개수 
    if (c == 0) cout << 0 << endl; 
    else{
        ll g = gcd(c,d); // 기약분수로 만드는 과정 
        cout << (c/g) << "/" << (d/g) << endl; 
    }
    return 0; 
}

2016/06/02 16:09

iljimae

while __name__ == '__main__':
    print((lambda a, b: __import__('fractions').Fraction(int(b**0.5) - int(a**0.5),b-a))(*list(map(int, input('a, b:').split()))))

파이썬 3.5.1 64

2016/06/17 23:57

Flair Sizz

이렇게 한줄로 코드 작성하는 방법은 어떻게 공부해야 하나요? 매우 세련되어 보입니다. 보면 대충 이해는 가는데 문법을 잘 모르겠습니다. - Dr.Choi, 2016/07/03 23:07
문법 자체는 어렵지 않습니다. 기껏해야 lambda 응용입니다. 그냥 길게 작성한 뒤에 줄이려고 노력해 보세요. 다만 연습이니까 이리 줄여도 되는 거지, 가독성을 위한다면 적절히 줄이는 것이 좋습니다. - Flair Sizz, 2016/07/03 23:22

Python 2.7.12 입니다.

import fractions as fr
print(fr.Fraction(int(b**0.5)-int(a**0.5),b-a))

2016/08/31 12:30

Lee Way

파이썬 2.7입니다. 뭔가 잘못된거 같기도 한데..

a, b = 1, 4
print("%d/%d" %(int(b ** 0.5) - int (a ** 0.5), b - a))

2016/06/02 17:45

정민 허

기약분수로 만들어주세요. - Flair Sizz, 2016/06/26 16:53

Java로 구현하였습니다.

import java.util.Scanner;

public class GiftIsWhat {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String str = sc.nextLine();
        String[] parsedData = str.split(" ");

        int a = Integer.parseInt(parsedData[0]);
        int b = Integer.parseInt(parsedData[1]);

        int temp1 = 0;

        for (int i = a + 1; i <= b; i++) {
            int temp2 = (int)Math.sqrt(i);
            if (i == temp2 * temp2)
                temp1++;
        }

        if (temp1 == 0)
            System.out.println("0");
        else {
            int temp4 = gcd (b - a, temp1);
            temp1 = temp1 / temp4;
            int temp3 = (b - a) / temp4;
            System.out.println(String.valueOf(temp1) + "/" + String.valueOf(temp3));
        }
    }

    public static int gcd(int p, int q) {
        if (q == 0) return p;
        return gcd(q, p % q);
    }
}

gcd() 함수 참고 : https://ko.wikipedia.org/wiki/유클리드_호제법

좀 느려터진 방법 같기도 합니다.

2016/06/04 15:31

손 량

Ruby

루비 내장함수 Rational.

odds = ->a,b { Rational((b**0.5).to_i-(a**0.5).to_i, b-a) }

Test

expect(odds[1, 4]).to eq "1/3".to_r
expect(odds[1,16]).to eq "1/5".to_r
expect(odds[1,2**60]).to eq "1/1073741825".to_r

Output

#=> puts odds[1,16]  3/15 => Rational에 의해 1/5 출력됨.
1/5

2016/06/06 14:37

rk

in.fun = function(a, b){
  tmp = c((a+1):b)
  step = lapply(tmp, function(x) seq_len(x)[x%%seq_len(x) == 0] %>% length) %>% unlist
  return(paste0(tmp[which(step%%2 != 0)] %>% length, "/", length(tmp)) )

}

> in.fun(a = 1, b= 4)
[1] "1/3"

R

2016/06/30 13:04

Byun Seongjun 변성준

def yaksu(a):
    c=[]
    d=int(pow(a,2))
    for i in range(1,d+1):
        if a % i == 0 :
            c.append(i)
    return len(c)
def maxyak(a,b):
    n=a%b
    if n == 0:
        return b
    else:
        return maxyak(b,n)
ans=0
a,b=input().split()
for i in range(int(a)+1,int(b)+1):
    if yaksu(i) % 2 == 1:
        ans+=1
l=int(b)-int(a)
if ans == 0 :
    print("0")
else:
    k=maxyak(ans,int(b)-int(a))
    print(int(ans/k),"/",int(l/k))

2016/07/03 22:41

Dr.Choi

어마어마한 시간이 걸리는 군요. 수학 공부를 해야겠어요. - Dr.Choi, 2016/07/03 22:42

c언어입니다!. 분모를 b-a로 두고, 분자를 반복문을돌려 N^2 > a 이면서, N^2 <= b 인 N값을 카운트하였습니다. 그리고 약분은 유클리드호제법으로 최대공약수를구한후 기약분수로 만들었습니다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>

int Euclid(int a, int b)
{
    if (a == 0 || b == 0)
        return 1;
    int max, min;

    if (a < b)
    {
        min = a;
        max = b;
    }
    else
    {
        max = a;
        min = b;
    }
    int value = max % min;
    while (value)
    {
        max = min;
        min = value;
        value = max % min;
    }
    return min;
}
int main()
{
    long long a = 0, b = 0;
    scanf(" %lld", &a);
    scanf(" %lld", &b);//a<b
    long long N = 2;
    int count = 0;
    while (N*N <= a)
    {
        N++;
    }

    while (N*N <= b)
    {
        count++;
        N++;    
    }

    long long all = b - a;
    int gCD = Euclid(all, count);
    if (count == 0)
        printf("0");
    else
        printf("%d/%lld", count / gCD, all /gCD);
}

2016/07/04 00:33

양 상호

#include <stdio.h>
#include <stdlib.h>
int getNdivisor(int value);
void main(void) {

    int a = 1;
    int b = 4;

    int out_bottom = b -a;
    int out_up = 0;

    for(int i = a+1 ; i <=b ; i++) {
        if(getNdivisor(i)%2 !=0) {
            out_up++;
        }
    }

    printf("\n%d / %d\n", out_up, out_bottom);

}

int getNdivisor(int value) {
    int count = 0;

    for(int i = 1 ; i <= value; i++) {
        if(value%i == 0)
            count++;
    }

    return count;
}

2016/09/13 15:17

코딩초보

#include <stdio.h>
#include <stdlib.h>
int getNdivisor(int value);
void main(void) {

    int a = 1;
    int b = 4;

    int out_bottom = b -a;
    int out_up = 0;

    for(int i = a+1 ; i <=b ; i++) {
        if(getNdivisor(i)%2 !=0) {
            out_up++;
        }
    }

    printf("\n%d / %d\n", out_up, out_bottom);

}

int getNdivisor(int value) {
    int count = 0;

    for(int i = 1 ; i <= value; i++) {
        if(value%i == 0)
            count++;
    }

    return count;
}

2016/09/13 15:18

코딩초보

public class Anything {
    public static void main(String[] args) {
        Scanner sc = new Scanner(in);

        BigDecimal aa = new BigDecimal(sc.next());
        BigDecimal bb = new BigDecimal(sc.next());

        double aaa = aa.doubleValue();
        double bbb = bb.doubleValue();
        double ccc = bbb - aaa;

        int ddd = (int) Math.sqrt(bbb) - (int) Math.sqrt(aaa);

        if (ddd == 0L) {
            System.out.println(0);
        } else {
            System.out.printf("%d / %.0f\n", ddd, ccc);
        }
    }
}

2017/03/30 11:34

genius.choi

#-*- coding:utf-8 -*-
from fractions import Fraction


#(1 ≤ a, b ≤ 2^60)
def f_inha(a,b):
    arr = array([i**2 for i in range(2, int(b**0.5)+1)])
    den = b-a
    sum = 0
    for i in range(a+1,b+1):
        if filter(lambda x:i%x==0,arr):
            sum+= 1
    return Fraction(sum,den)


print f_inha(1,2000)

2017/04/22 15:03

daybreak

package coding_2017_5;

/*
 * 약수의 갯수가 홀 수일 경우 -> 제곱수
 * 그러니까 (sqrt(n))^2 = n이 되는 수를 찾습니다.
 * 하지만 1부터 시작해서 a~b 사이를 찾고자 할 때 a가 너무 크면 시간이 오래걸리니까
 * sqrt(a)를 해 a와 가장 가까운 제곱수부터 찾기 시작합니다.
 * 
 * 확률의 기약분수는 유클리드 호제법을 이용했습니다.
 * (출처 : https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95)
 *
 * 1. 입력으로 두 수 m,n(m>n)이 들어온다.
 * 2. n이 0이라면, m을 출력하고 알고리즘을 종료한다.
 * 3. n이 m을 나누어떨어지면, n을 출력하고 알고리즘을 종료한다.
 * 4. 그렇지 않으면, m을 n으로 나눈 나머지를 새롭게 m에 대입하고, m과 n을 바꾸고 3으로 돌아온다.
 */
public class problem_110 {
    private static StringBuffer buffer;

    public static void main(String[] args) {
        double a = 1, b = 11;
        buffer = new StringBuffer();

        int power_count = 0;
        int i = (int) Math.sqrt(a);
        double power = i * i;

        for (; power <= b; power = i * (i++)) {
            if (power > a && power <= b)
                power_count++;
        }

        if (power_count == 0) {
            buffer.append("0");
        } else {
            double child = power_count;
            double parent = b - a;
            double gcd = euclidean(parent, child);

            parent = parent/gcd;
            child = child/gcd;

            System.out.println(gcd);
            buffer.append(child);
            buffer.append("/");
            buffer.append(parent);
        }

        System.out.println(buffer.substring(0));
    }

    // b >= a
    public static double euclidean(double b, double a) {
        double r = 0;
        double temp = 0;
        while (true) {
            r = b % a;
            if (a == 0)
                return b;
            else if(r == 0)
                return a;
            else {
                temp = b;
                b = a;
                a = temp % r;
            }
        }

    }
}

2017/05/19 17:41

KimSeonbin

var input = "1 4";
var [a, b] = input.split(" ");
var [c, d] = [a, b].map(v => parseInt(Math.sqrt(v)));
var [n, m] = [d - c, b - a];
var gcd = (x, y) => y ? gcd(y, x % y) : x;
var g = gcd(n, m);

console.log(!n ? 0 : n / g + "/" + m / g);

2017/06/18 02:52

funnystyle

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);

        int a = s.nextInt();
        int b = s.nextInt();
        int cnt=0;
        for(int i=a+1;i<=b;i++) {
            if(IsOdd(divisor(i)))
                cnt++;
        }
        System.out.println(cnt+"/"+(b-a));
    }

    public static int divisor(int n) {
        int cnt=0 ;
        for(int i=1;i<=n;i++) {
            if(n%i==0)
                cnt++;
        }

        return cnt;
    }
    public static boolean IsOdd(int n) {
        boolean tf=false;
        if(n%2==1)
            tf=true;
        return tf;
    }

}

2017/08/01 12:42

김재인

from math import sqrt, floor, gcd

a, b = 1, 4
Ncnt, diff = floor(sqrt(b))-floor(sqrt(a)), b-a
G = gcd(Ncnt, diff)
print(Ncnt//G, '/', diff//G)

2017/08/21 20:47

Noname

def dividers(N) :
    dividers = []
    for n in range(1, N + 1) :
        if N % n == 0 :
            dividers.append(n)

    if len(dividers) % 2 == 1 :
        return True, dividers

    else :
        return False, dividers

a, b = int(input()), int(input())
total = list(range(a + 1, b + 1))
jackpot = []
for n in total :
    if dividers(n)[0] == True :
        jackpot.append(n)

if len(jackpot) == 0 :
    print(0)

son = len(jackpot)
mom = len(total)
divider = max(set(dividers(son)[1]) & set(dividers(mom)[1]))
son2 = round(son / divider)
mom2 = round(mom / divider)

print("%s / %s" % (son2, mom2))

2017/08/22 14:37

다크엔젤

자바입니다.

public class itemis {
    public static void main(String[] args) {
        //단, N은 약수의 개수가 홀수여야 한다.

        Scanner sc = new Scanner(System.in);

        int a= sc.nextInt();// 댓글 작성전 총 댓글 수 
        int b = sc.nextInt();//댓글 단 후 총 댓글 수 
        //찬미 댓글은 a< <=b   
        int denominator = b-a;
        int numerator = 0;
        int GD=0;
        String result="";
        for(int i=a+1;i<=b;i++){
            if(divisorCnt(i)%2==1){
                numerator++;
            };
        }
        if(numerator==0){
            result ="0";
        }else{
            GD = GD(numerator,denominator);
            int denominator2= denominator/GD;
            int numerator2 = numerator/GD;

                result = String.valueOf(numerator2)+"/"+String.valueOf(denominator2);
        }



        System.out.println(result);

    }
    //약수의 갯수 구하는 함수
    static int divisorCnt(int x){
        int cnt=0;
        for(int i=1;i<=x;i++){
            if(x%i==0) cnt++; 
        }
        return cnt;
    }
    //최대공약수로 나눠주는 함수 
    static int GD(int a, int b){
        int tmp=0;

        if(a <b){ //b가 크다면 자리바꿈
            tmp=b;
            b=a;
            a=tmp;
        }
        //이제 항상 a가 b보다 크다.
        while(b!=a){
              a -=b;
            if(b>=a){
                while(b!=a){
                    b -=a;
                }
            }
        }
        return a;

    }
}

2017/10/16 14:00

김문수

a, b = input('input a, b : ').split()

c = int(int(b)**0.5) - int(int(a)**0.5)
d = int(b) - int(a)

gcd = lambda a, b : gcd(b, a%b) if a%b else b

print('%d/%d' %(c//gcd(c,d), d//gcd(c,d)))

2017/11/14 17:30

songci

a,b,x,r,q = int(input("숫자를 입력하세요(a)")),int(input("숫자를 입력하세요(b)")),[],0,1
for s in range(1,b-a+1):
       x.append(s)
while q**2 < x[len(x)-1]:
       if q**2 in x:
              r += 1
       q += 1
print("확률은 %d/%d 입니다" %(r,len(x)))

2018/01/09 19:30

김영성

파이썬 3.6

def inputdata(data):
    a = int(input("a = "))
    if a < 1 or a > 2**60:
        print("범위안의 값을 입력하세요.")
        return
    else: data.append(a)
    b = int(input("b = "))
    if b < 1 or b > 2**60 or b < a:
        print("범위안의 값을 입력하세요.")
        return
    else: data.append(b)

def prize(data):
    num = [i for i in range(data[0]+1,data[1]+1)]
    q = len(num)
    factor,oddfactor,x = [],[],0
    for i in num:
        for h in range(1,i+1):
            if i%h == 0:
                x = i/h
                factor.append(h)
        if len(factor)%2 != 0:
            oddfactor.append(i)
        factor = []
    print("%d/%d"%(len(oddfactor),q))

if __name__ == "__main__":
    data = []
    try:
        inputdata(data)
        prize(data)
    except IndexError:
        pass
  • 결과값
a = 1
b = 4
1/3

2018/01/19 10:29

justbegin


``````{.cs}
using System;

class Solution
{
    static void Main(String[] args)
    {
        string[] str = Console.ReadLine().Split(' ');
        int[] arr = new int[str.Length];
        for (int i = 0; i < arr.Length; i++)
            arr[i] = int.Parse(str[i]);

        int NumOfsummary = 0;

        for(int i = arr[0] + 1; i <= arr[1]; i++)
        {
            int count = 0;

            for(int j = 1; j <= i; j++)
            {
                if(i % j == 0) //약수이면 카운트
                {
                    count++;
                }
            }
            if(count % 2 == 1) //약수의 갯수가 홀수라면
            {
                NumOfsummary++;
            }
        }
        Console.WriteLine(NumOfsummary);

        int s = arr[1] - arr[0]; //분모에 쓸 수 (총 댓글수)

        //최대 공약수 구해서 기약분수로 나타내기
        for (int i = arr[1] - 1; i > 1; i--)
        {
            if(NumOfsummary % i == 0 && arr[1] % i == 0)
            {
                NumOfsummary /= i;
                s /= i;
            }
        }
        Console.WriteLine("{0} / {1}",NumOfsummary , s);
    }
}

2018/01/28 16:47

와디더

# 파이썬

def aliquot_odd(i1, i2):
    gift = 0
    reply = i2-i1
    for m in range(i1+1, i2+1):
        if m**0.5 == int(m**0.5):
            gift += 1

    for n in range(2, gift+1):
        if gift % n == 0 and reply % n == 0:
            gift = gift / n
            reply = reply / n
    return str(int(gift)) + " / " + str(int(reply))


print(aliquot_odd(1, 4))
print(aliquot_odd(2, 9))
print(aliquot_odd(2, 10))

2018/02/01 01:39

olclocr

import math
def prob(a, b):
    if math.sqrt(a).is_integer:
        return '{0}/{1}'.format((int(math.sqrt(b)) - int(math.sqrt(a))), b-a)
    else:
        return '{0}/{1}'.format((int(math.sqrt(b)) - int(math.sqrt(a)+1)), b - a)


print(prob(1, 4))

2018/02/14 10:50

김동하

using System;
using System.Collections.Generic;

namespace CSharp_codingTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = int.Parse(Console.ReadLine());
            int b = int.Parse(Console.ReadLine());

            int hcount = 0; //약수의 갯수가 홀수인 수의 갯수

            //a + 1에서 b사이의 수중에서 약수의 갯수가 홀수인 수의 확률 구하기
            for(int i = a + 1; i <= b; i++)
            {
                int count = 0; //약수의 갯수 count

                for(int j = 1; j <= i; j++)
                {
                    if(i % j == 0)
                    {
                        count++;
                    }
                }
                if (count % 2 == 1) //약수의 갯수가 홀수라면
                {
                    Console.WriteLine("Debug : " + i); //디버깅
                    hcount++;
                }

            }
            if (hcount == 0)
                Console.WriteLine("0");
            else
            {
                //분모 분자로 쓸 변수
                int m = b - a;
                int n = hcount;

                //기약분수로 바꾸기
                for(int i = n; i > 1; i--)
                {
                    if (m % i == 0 && n % i == 0)
                    {
                        m /= i;
                        n /= i;
                        if (i == n)
                            break;
                    }
                }
                Console.WriteLine(m + " / " + n);
            }
        }
    }
}

2018/02/26 17:51

와디더

import math
def percentage(a, b):
    possible = list(range(a + 1, b + 1))
    canget = []
    for sq in possible:
        if math.sqrt(sq)%1 == 0:
            canget.append(sq)
    divison = []
    for find in range(1, int(math.sqrt(len(canget))//1)+1):
        if len(canget)%find == 0:
            divison.append(find)
    for devide in divison[::-1]:
        if len(possible)%devide == 0:
            largest = devide
            break
    return str(int(len(canget)/largest)) + '/' + str(int(len(possible)/largest))
source = input().split()
print(percentage(int(source[0]), int(source[1])))

Python 3

2018/04/22 14:17

myyh2357

user_input = input()
operands = user_input.split()
a = int(operands[0])
b = int(operands[1])

# a = 작성하기 전 총 댓글 수
# b = 작성 후 총 댓글 수
cnt = list(range(a+1,b+1)) # 댓글이 존재할 수 있는 범위

result = []
for number in cnt: # 약수의 개수가 홀수인지 판별
    count = 0

    for k in range(1,number+1):
        if number % k == 0:
            count += 1
        else:
            pass

    if count % 2 == 1:
        result.append(number)

print(str(len(result))+ '/' + str(len(cnt)))


2018/05/08 00:21

최우성

user_input = input()
operands = user_input.split()
a = int(operands[0])
b = int(operands[1])

# a = 작성하기 전 총 댓글 수
# b = 작성 후 총 댓글 수
cnt = list(range(a+1,b+1)) # 댓글이 존재할 수 있는 범위

result = []
for number in cnt: # 약수의 개수가 홀수인지 판별
    count = 0

    for k in range(1,number+1):
        if number % k == 0:
            count += 1
        else:
            pass

    if count % 2 == 1:
        result.append(number)

if len(cnt) % len(result) == 0: # 2/4
    final2 = len(cnt) // len(result)
    final = 1
else:
    final = len(result)
    final2 = len(cnt)


print(str(final)+ '/' + str(final2))



2018/05/08 00:32

최우성

public class test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(in);

        BigDecimal aa = new BigDecimal(sc.next());
        BigDecimal bb = new BigDecimal(sc.next());

        double aaa = aa.doubleValue();
        double bbb = bb.doubleValue();
        double ccc = bbb - aaa;

        int ddd = (int) Math.sqrt(bbb) - (int) Math.sqrt(aaa);

        if (ddd == 0L) {
            System.out.println(0);
        } else {
            System.out.printf("%d / %.0f\n", ddd, ccc);
        }
    }
}

2018/06/04 12:18

聂金鹏

Python

a, b = 1, 4 #a, b = map(int, input().split(' '))
ans = dict()
for i in range(a+1, b+1):
    div = 0
    for j in range(1, i+1):
        if i % j == 0:
            div += 1
    if div % 2 == 1:
        ans[i] = j
if len(ans) > 0:
    x = len(ans)
    y = b-a
    if y%x == 0:
        y = y//x
        x = 1
    print("{}/{}".format(x, y))
else:
    print(0)

2018/06/12 15:35

Taesoo Kim

a,b = int(input('a: ')),int(input('b: '))
noc, n = int(b**0.5)-int(a**0.5), b-a
gcd = lambda a,b: a if b==0 else gcd(b,a%b)
g = gcd(noc,n)
print(noc//g,n//g,sep='/')

2018/07/24 17:44

Creator

from fractions import Fraction

a=int(input('a입력 '))
b=int(input('b입력 '))
X=0
count=0

#범위값
lists=[i for i in range(a+1,b+1)]

for i in lists:
    for j in range(1,i+1):
        if i%j==0:
            count+=1

    if count%2!=0: #홀수일경우
        X+=1
    count=0
#확률
print(Fraction(X,len(lists)))

2018/12/19 16:49

S.H

import math
(a, b) = input('Enter your input : '). split()
cnt = 0
for num in range(int(a)+1, int(b)+1):
    if math.sqrt(num) == int(math.sqrt(num)): cnt += 1
nom = cnt
denom = int(b)-int(a)
for ft in range(1,nom+1):
    if denom % ft == 0:
        nom = nom // ft
        denom = denom // ft

prob = str(nom) + '/' + str(denom)
print(prob)

2019/01/11 15:00

판다네밥상

a=int(input('댓글을 작성하기전의 총 댓글 수: '))
b=int(input('댓글을 작성한 후의 총 댓글 수: '))
if b<=a:
    print('작성한 후의 댓글 수는 작성하기전의 총 댓글 수 보다 커야한다')
else:
    #약수의 개수가 짝수인 경우는 완전제곱수이다.
    count=0
    for i in range(a+1,b+1):
        if i**(0.5)%1==0:
            count+=1
    #기약분수로
    x=b-a
    j=2
    while j<=count:
        if x%j==0 and count%j==0:
            x=x//j
            count=count//j
            j=1
        j+=1
    print('구하는 확률: ',count,'/',x)




2019/01/21 15:18

GammaKnight

import math
a, b = map(int, input().split())

def divisor_odd(n):
    count = 0
    for i in range(1, n+1):
        if n % i == 0:
            count += 1
    if count % 2 == 0:
        return False
    else:
        return True

count = 0
total = b-a
for i in range(a+1, b+1):
    if divisor_odd(i):
        count += 1

gcd = math.gcd(count, total)
count = int(count / gcd)
total = int(total / gcd)

print('{}/{}'.format(count,total))

2019/02/07 11:41

D.H.

from fractions import Fraction

a, b = map(int, input().split())

# 홀수 개의 약수를 가지려면 항상 완전 제곱수
# 사례. (3, 10] 사이의 완전 제곱수는 (3**0.5, 10**0.5] = (1.xx, 3.xx] => 1개 (2)
# 즉, (a, b] 사이의 완전 제곱수의 개수는 다음과 같다.
count = int(b ** 0.5) - int(a ** 0.4)

# 기약분수표현
f = Fraction(count, b - a)
print(f"{f.numerator}/{f.denominator}")

2019/03/05 16:47

mohenjo

import fractions as fr

def product(input):
    a =input.split()
    res=0
    for i in range(int(a[0])+1,int(a[1])+1):
        temp=0
        for k in range(1, i+1):
            if i%k == 0: temp+=1            
        if temp%2==1: res+=1

    return fr.Fraction(res,int(a[1])-int(a[0]))


print(product(input()))

2019/03/05 19:31

얀차

import math, fractions
#약수의 개수가 홀수이면 True, 짝수이면 False
def func(n):
    cnt=0
    sqrt_n=int(math.sqrt(n))
    for i in range(1, sqrt_n):
        if i%n==0:
            cnt+=1
    if sqrt_n*sqrt_n==n:
        cnt+=1
    return cnt%2==1

def percentage_gift():
    num=input().split()
    #입력받은 숫자 범위 넣기.
    li=[x for x in range(int(num[0])+1, int(num[1])+1)]
    #약수가 홀수인 것 찾기
    gift=list(filter(func,li))    
    #기약분수 표현
    percentage = fractions.Fraction(len(gift),len(li))
    return percentage

2019/03/11 21:17

쨔이

a = int(input("a:"))
b = int(input("b:"))
divisorCnt, toCnt, oddCnt = 0, 0, 0
for i in range(a+1,b+1):
    toCnt += 1
    for j in range(1,i+1):
        if i % j == 0:
            divisorCnt += 1
    if divisorCnt % 2 != 0:
        oddCnt += 1
    divisorCnt = 0

print(" {}/{} ".format(oddCnt, toCnt))

2019/04/19 15:43

Chang Hwan Kim

a,b=map(int,input().split())

def GCD(q,w):
    if w==0:
        return q
    if w==1:
        return 1

    return GCD(w,q%w)

print("{}/{}".format(int(int(b**0.5-a**0.5)/GCD(b,a)),int((b-a)/GCD(b,a))))

먼저 홀수개의 약수를 갖는 수를 파악하는것에 시간을 들였고, 기약분수로 만드는 과정이 꽤 골치거리였읍니다. 그러나 유클리드의 호제법을 따라서 하여보니 바로 나오더군요. 오류없이 단번에 재귀함수를 가동시킨 드물은 문제였읍니다.^^

2019/05/08 16:37

암살자까마귀

from math import sqrt

x, y = raw_input('예제 입력 : ').split()
cnt = 0
for i in range(int(x)+1, int(y)+1):
    if sqrt(i) % 1 == 0.0:
        cnt += 1

print '0' if cnt == 0 else str(cnt) + "/" + str(int(y)-int(x))

처음엔 위에처럼 코드를 짜봤는데 숫자가 올라갈수록 걸리는 시간이 너무 오래 걸리고 답이 기약분수의 형태도 아니어서 위에분의 답변을 참고했습니다 감사합니다.

from math import sqrt

def gcd(a, b): # 최대공약수 구하기
    if b == 0: return a
    return gcd(b, a%b)

x, y = raw_input('예제 입력 : ').split()
n = int(sqrt(int(y))) - int(sqrt(int(x))) # 두 숫자 사이에 약수의개수가 홀수인 숫자의 개수
m = int(y) - int(x)
c = gcd(n, m)
print str(n/c) + '/' + str(m/c)

2019/07/17 21:14

인애

public class 상품is뭔들_2016_인하대_프로그래밍_경진대회_B번 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());

        int 전체 = b-a;
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int count=0;
        for(int i=a+1; i<=b; i++) {
            for(int j=1; j<i; j++) {
                if(j*j==i) {
                    count++;
                }
            }
        }
        if(count==0) {
            bw.write(0);
            bw.close();
        }
        else if(count==1) {
            bw.write(count+"/"+전체);
            bw.close();
        }
        else {
            for(int i=2; i<=count; i++) {
                if(count%i==0&&(전체)%i==0) {
                    count/=i;
                    전체/=i;
                }
            }
            bw.write(count+"/"+전체);
            bw.close();
        }
    }
}

버퍼를 사용해서 풀어봤습니다.

2019/11/27 17:49

big Ko

start = int(input())
end = int(input())
count = 0

if start <= end :
    for i in range(start+1, end+1):
        tmp_count = 0
        for j in range(1, i+1):
            if i % j == 0:
                tmp_count += 1
        if tmp_count %2 ==1:
            count += 1
    print(count,"/",end-start)        

else :
    print("입력 오류")

2020/01/24 23:20

semipooh

N = list(map(int,input().split()))
okint = 0
allint = N[1] - N[0]
def checkmain(N):
    check = 0
    for i in range(1,N+1):
        if N % i == 0:
            check += 1
    if check % 2 == 1:
        return 1
    elif check % 2 == 0:
        return 0
for i in range(N[0]+1,N[1]+1):
    check = checkmain(i)
    if check == 1:
        okint += 1
for i in range(1,okint+1):
    if allint % i == 0:
        if okint % i == 0:
            allint = allint / i
            okint = okint /i
print(str(int(okint))+'/'+str(int(allint)))

2020/04/03 00:29

BlakeLee

def yaksu_su(x):
   su=0
   for i in range (1,x+1):
      if x%i==0:
         su+=1
   return (su)

c=str(input('a=  b=  ')).split(' ')
a,b=int(c[0]),int(c[1])

if a>=1 and b>a and b<2*60:
   d,e=b-a,0

   for i in range (a+1,b+1):
    if (yaksu_su(i)%2)!=0:
        e+=1

   i=2
   while (i<=e):
    if e%i==0 and d%i==0:
        d/=i
        e/=i
        i-=1
    i+=1

   if e==0:
    print (0)
   else:        
    print (int(e),'/',int(d))

2020/04/21 01:53

Buckshot

<결과> a= b= 1 4 1 / 3 a= b= 4 10 1 / 6 a= b= 20 30 1 / 10 - Buckshot, 2020/04/21 01:54
def divisor(num):
    count=0
    for i in range(1,num+1):
        if num%i==0:
            count+=1
    return count

a,b=map(int,input("").split(" "))
count=0
for i in range(a+1,b+1):
    if divisor(i)%2!=0:
        count+=1

if count==0:
    print(0)
else:
    print(str(count)+"/"+str(b-a))

2020/05/04 21:40

kim center

import time

def Prob(a, b):
    temp1 = [i for i in range(1, b+1)]
    temp2 = [j for j in range(1, a+1)]

    s = set(temp2)
    temp3 = [x for x in temp1 if x not in s]

    return str(divisor(temp3)) + '/' + str(len(temp3))

def divisor(temp):
    odd = 0
    for i in temp:
        div = []
        for j in range(1, int(i**0.5)+1):
            if i % j == 0:
                div.append(j)
                if j != i//j:
                    div.append(i//j)
        if len(div) % 2 == 1:
            odd += 1
    return odd

if __name__ == '__main__':
    t = time.time()
    a, b = 1, 2**10
    print('상품 채택 확률: {}, 소요시간: {}'.format(Prob(a, b), time.time() - t))

2020/05/05 12:11

Hwaseong Nam

import fractions
def inha(a,b):
    a = int(a)
    b = int(b)
    cnt = 0
    for i in range(a,b):
        yaksu = []
        for j in range(1,i+1):
            if i%j == 0:
                yaksu.append(j)
            else:
                continue
        if len(yaksu)%2 == 1:
            cnt += 1
        else:
            continue
    result = fractions.Fraction(cnt,b-a)
    return print('%d/%d' %(result.numerator,result.denominator) )

2020/05/14 22:22

Money_Coding

def test(a, b):
    answer = 0
    for i in range(a + 1, b + 1):
        temp = []
        for k in range(1, i+1):
            if i % k == 0:
                temp.append(k)
        if len(temp) % 2 == 1:
            answer += 1
    print(answer / (b - a))


test(1, 4)
test(1, 9)

2020/11/30 14:56

김우석

import math as m

def find_per(numbers):

  count=0

  for i in range(1,numbers+1,1):

    if numbers%i==0:

      count+=1

  return count

def all_is_OK(a,b):

  count=0

  check=0

  for i in range(a+1,b+1,1):

    count+=1

    if find_per(i)%2!=0:

      check+=1

  gcds=m.gcd(count,check)

  count=int(count/gcds)

  check=int(check/gcds)

  print("{0}/{1}".format(check,count))

def main():

  a=int(input("write your number :"))

  b=int(input("write your numver :"))

  all_is_OK(a,b)

main()

2021/01/05 12:04

전준혁

def func1(n):
    N = int(n)
    yaksu = []
    for i in range(1, N+1):
        if N % i == 0:
            yaksu.append(i)
    # print(yaksu)
    if len(yaksu) % 2 == 0:
        return False
    else:
        return True

def func2(a, b):
    count = 0
    for i in range(int(a)+1, int(b)+1):
        if func1(i):
            count += 1
    prob = count / (int(b) - int(a))
    return print(prob)

func2(1, 4)

2021/03/25 07:52

DSHIN

a=int(input("수입력"))
b=int(input("수입력"))
rate=0
for i in range(a+1,b+1):  # 2 3 4
    count=0
    for j in range(2,i):  # 2 3
        if i%j==0:
            count+=1
    if count%2==1:
        rate+=1
def gcd(a, b):
  while (b != 0):
    temp = a % b
    a = b
    b = temp
  return abs(a)

print("{}/{}".format(int(rate/gcd(b-a,rate)),int((b-a)/gcd(b-a,rate))))

2021/03/27 22:46

fox.j

def ism(a,b):
    c = 0
    for i in range(a+1,b+1):
        l=[]
        for e in range(1,i+1):
            if i%e==0: l.append(i)
        if len(l)%2==1: c+=1
    if c==0: print('0%')
    else : return print(f'{c}/{b-a}')


ism(1,4)

2021/06/03 13:09

약사의혼자말

#codingdojing_2016_inha

## 최대공약수 구하기 // 유클리드 호제법
def GCD(x, y):  #x > y, 

    if x%y == 0: return y
    else: return GCD(y, x%y)


a,b = map(int,input().split())

cnt = 0
for i in range(a+1,b+1):
    if (i**0.5) % 1 == 0:       #i의 약수가 홀수이기 위해서는 모든 약수가 짝수개여야 함.
        cnt += 1

denominator = b - a

if cnt == 0: print(cnt) #0인 경우
else:
    c = GCD(denominator, cnt)
    d = cnt//c
    e = denominator//c
    if e == 1: print(1) #1인 경우
    else: print(f'{d}/{e}')

2021/08/18 13:53

Jaeman Lee

python 3.9입니다.

def gcd(num1, num2):
    while num2 != 0:
        r = num1 % num2
        num1 = num2
        num2 = r
    return num1

a, b = [int(var) for var in input().split()]
c, d = int(b ** 0.5) - int(a ** 0.5), b - a
print(f'{c // gcd(c, d)} / {d // gcd(c, d)}' if c else 0)

결과입니다.

1 4
1 / 3

5 8
0

4 16
1 / 6

2021/09/22 16:32

이준우


from fractions import Fraction

while True:
    a = int(input("댓글 작성 전 댓글의 수:"))
    b = int(input("댓글 작성 후 댓글의 수:"))
    if a >=1 and a<=2**60 and b >=1 and b<=2**60 and b>a:
        break

fraction = b-a
cnt = 0
for i in range(a+1,b+1):
    n =0
    for k in range(1,i+1):
        if i%k == 0 :
            n+=1
    if n%2 ==1:
        cnt +=1
prob = Fraction(cnt,fraction)
print("상품을 받을 확률은 :",prob)

2022/01/04 19:51

양캠부부

import math
a,b = 1,4

total = [x**2 for x in range(1, int(b**.5)+1)]
remain = [x for x in total if a<x<=b]
gcd = math.gcd((b-a),len(remain))
print(f'{int(len(remain)/gcd)}/{int((b-a)/gcd)}')

2022/02/16 14:47

로만가

using System;
using System.Collections.Generic;

namespace FirstProgram
{
    class Program
    {
        static int divisor(int n)
        {
            int get = 0;

            for(int i=1; i<=n; i++)
            {
                if (n % i == 0)
                    get++;
            }
            return get;
        }

        static void Main(string[] args)
        {
            string[] str = Console.ReadLine().Split(' ');
            List<int> arr = new List<int>();
            int oddCount = 0;

            for(int i=int.Parse(str[0])+1; i<=int.Parse(str[1]); i++)
            {
                arr.Add(i);
            }

            for(int i=0; i<arr.Count; i++)
            {
                if (divisor(arr[i]) % 2 == 1)
                    oddCount++;
            }

            Console.WriteLine(oddCount + "/" + arr.Count);
        }
    }
}

C#

2022/03/13 21:40

rah_9

from math import gcd

a, b = map(int, input('a b : ').split(' '))

def divisor(n):
    count = 0
    for i in range(1,n+1):
        if n % i == 0:
            count += 1
    if count % 2 == 1:
        return True

count = 0

for i in range(a+1,b+1):
    if divisor(i) == True:
        count += 1

gcd = gcd(count, b-a)

print(f'{count//gcd}/{(b-a)//gcd}')

2022/06/26 14:26

김시영

import sys


def fractioneR (AA,BB) :
      pass


def sonmakeR (AA,BB) :
      resultt = 0
      for N in range (AA+1,BB+1) :
            if float(int( (N)**(1/2) )) == (N)**(1/2) : resultt += 1
      return resultt


def dividermakeR (AA) :
      resultlistt = []
      for N in range (1,AA+1) :
            if AA % N == 0 : resultlistt.append(N)
      return resultlistt


def answermakeR ( AA, BB ) :
      newAA = AA
      newBB = BB
      Alistt = dividermakeR(AA)
      Blistt = dividermakeR(BB)
      for Adividerr in Alistt :
            if Adividerr in Blistt :
                  newAA = newAA // Adividerr
                  newBB = newBB // Adividerr

      print( f'{newAA}/{newBB}' )


[a,b] = sys.stdin.readline().strip().split(' ')
a = int(a)
b = int(b)

mothernumberr = b-a
sonnumberr = sonmakeR(a,b)

answermakeR (sonnumberr , mothernumberr )

2022/07/15 23:48

손은상

#include<stdio.h>
#include<math.h>
int main(void)
{
    unsigned long long a, b;
    int numer = 0, denom = 0;       // numer는 분자, denom은 분모
    register int i;

    scanf("%lld%lld", &a, &b);

    for (i = a + 1; i <= b; i++)
    {   
        denom++;
        if (round(sqrt(i)) == sqrt(i))  numer++;
    }
    printf("%d/%d", numer, denom);

}

c언어입니다.

2022/08/06 02:37

코딩재미

package Calculator;

import java.util.Scanner;
import java.util.LinkedList;
import java.util.ListIterator;

public class CalculatorProblem {
    static LinkedList<Integer> list;

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        list = new LinkedList<>();
        CalculatorProblem calc = new CalculatorProblem();

        while(true) {
            System.out.print("$ Input: ");
            int before = scan.nextInt();
            int after = scan.nextInt();

            // Check the bound.
            if(before<1 || before>after || after<1) {
                System.out.println("Out of bound.");
                continue;
            }

            // Initialization.
            for(int i=before+1; i<=after; i++) {
                list.add(i);
            }

            // Print list.
            ListIterator iter = list.listIterator();
            calc.printList("Before elimination", iter);

            // Removes elements with an even number of divisor.
            calc.removeElements(iter);
            calc.printList("After elimination", iter);

            // Calculate probability with winning.
            System.out.printf("  -> Probability: 1/%d\n", list.size());
        }
    }

    // Print the list.
    private void printList(String contents, ListIterator iter) {
        moveFirst(iter);
        System.out.printf("  -> %s: ", contents);

        while(iter.hasNext()) {
            System.out.printf("%d ", iter.next());
        }

        System.out.println();
    }

    // Move front of first node.
    private void moveFirst(ListIterator iter) {
        while(iter.hasPrevious()) {
            iter.previous();
        }
    }

    // Removes elements with an even number of divisor.
    private void removeElements(ListIterator iter) {
        moveFirst(iter);

        while(iter.hasNext()) {
            int index = (int)iter.next();
            if(isDivisorEven(index)%2==0) {
                iter.remove();
            }       
        }
    }

    // Check elements with an even number of divisor.
    private int isDivisorEven(int index) {
        int count = 0;

        for(int i=1; i<= index; i++) {
            if(index%i ==0)
                count++;
        }

        return count;
    }
}

리스트로 풀어봤습니다.

2022/09/15 03:06

유로

def isOddDiv(num):
    if num / int(num**0.5) == int(num**0.5):
        return True
    return False

def gcd(n1, n2):
    if n1 == 0:
        return n2
    return gcd(n2 % n1, n1)

a, b = map(int, input('a b: ').split())
bunmo = b - a
bunja = 0
for i in range(a+1, b+1):
    if isOddDiv(i):
        bunja += 1
gd = gcd(bunja, bunmo)
print(bunja//gd,'/', bunmo//gd)

2023/11/03 21:29

insperChoi

목록으로