Math

์ˆ˜ํ•™๊ณผ ๊ด€๋ จ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณผ ๊ฒƒ์ด๋‹ค.

๋‚˜๋จธ์ง€์—ฐ์‚ฐ

๋ฌธ์ œ ์ค‘ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋ผ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ๋‹ต์„ ๋‹ค ๊ตฌํ•œํ›„์— ๊ตฌํ•˜๋ฉด ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์ค‘๊ฐ„์— ํ•ด์ค˜์•ผํ•œ๋‹ค.

(A+B)%C = ((A%C)+(B%C))%C

ex) A = q1*c + r1, B = q2*c + r2
A+B = (q1+q2)*c + (r1+r2)
(A+B)%c = (r1+r2)%c
A%c = r1, B%c = r2
  • ๊ณฑํ•˜๊ธฐ์˜ ๊ฒฝ์šฐ์—๋„ ์„ฑ๋ฆฝํ•œ๋‹ค.

  • ํ•˜์ง€๋งŒ ๋‚˜๋ˆ„๊ธฐ์˜ ๊ฒฝ์šฐ์—๋Š” ์„ฑ๋ฆฝํ•˜์ง€์•Š๋Š”๋‹ค.(Modular Inverse๋ฅผ ๊ตฌํ•ด์•ผํ•œ๋‹ค.)

  • ๋บ„์…ˆ์˜ ๊ฒฝ์šฐ ๋จผ์ € mod๋ฅผ ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— (A-B)%M = ((A%M)-(B%M)+M)%M์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.

#include <iostream>
using namespace std;

int main(){
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    // ์ฒซ์งธ ์ค„์— (A+B)%C, ๋‘˜์งธ ์ค„์— (A%C + B%C)%C, ์…‹์งธ ์ค„์— (Aร—B)%C, ๋„ท์งธ ์ค„์— (A%C ร— B%C)%C๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
    printf("%d\n%d\n%d\n%d",(a+b)%c,(a%c+b%c)%c,(a*b)%c,(a%c*b%c)%c);
}

์ตœ๋Œ€๊ณต์•ฝ์ˆ˜(Gretest Common Divisor)

๋‘ ์ˆ˜ A์™€ B์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ G๋Š” A์™€ B์˜ ๊ณตํ†ต๋œ ์•ฝ์ˆ˜ ์ค‘์—์„œ ๊ฐ€์žฅ ํฐ ์ •์ˆ˜์ด๋‹ค. ์ด๋•Œ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๊ฐ€ 1์ธ ๋‘ ์ˆ˜๋ฅผ ์„œ๋กœ์†Œ(Coprime)์ด๋ผ๊ณ  ํ•œ๋‹ค.

  1. 2๋ถ€ํ„ฐ min(A,B)๊นŒ์ง€ ๋ชจ๋“  ์ •์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด๋ณด๋Š” ๋ฐฉ๋ฒ•

  2. ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(a๋ฅผ b๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ r์ด๋ผ ํ–ˆ์„ ๋•Œ, GCD(a,b)=GCD(b,r), r=0์ด๋ฉด ๊ทธ ๋•Œ b๊ฐ€ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜์ด๋‹ค.)

#include <iostream>
using namespace std;

//2. ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์žฌ๊ท€
int gcd(int a, int b){
    if(b==0){
        return a;
    }else{
        return gcd(b,a%b);
    }
}
//3. ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋น„์žฌ๊ท€
int gcd2(int a,int b){
    while(b!=0){
        int r=a%b;
        a=b;
        b=r;
    }
    return a;
}
int main(){
    int a,b,g;
    scanf("%d %d",&a,&b);
    g=1;
    //1. ๋ชจ๋“  ์ •์ˆ˜
    for(int i=2;i<=min(a,b);i++){
        if(a%i==0 && b%i==0){
            g=i;
        }
    }
}

a<b์ธ ๊ฒฝ์šฐ์—”๋Š a%b=a์ด๋ฏ€๋กœ ์ž๋™์œผ๋กœ a์™€ b๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋”ฐ๋กœ ๋Œ€์†Œ๊ด€๊ณ„๋ฅผ ๋น„๊ตํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

  • ์„ธ ๊ฐœ์ด์ƒ์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋Š” GCD(a,b,c)=GCD(GCD(a,b),c)์™€ ๊ฐ™์€ ์‹์œผ๋กœ ๊ณ„์†ํ•ด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜(Least Common Multiple)

๋‘ ์ˆ˜์˜ ๊ณตํ†ต๋œ ๋ฐฐ์ˆ˜ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์ •์ˆ˜์ด๋‹ค. ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๋Š” ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ, ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๋Š” ๋‘ ์ˆ˜๋ณด๋‹ค ํฐ ์ˆ˜์ด๋ฏ€๋กœ ๋ฒ”์œ„๋ฅผ ์ž˜ ํ™•์ธํ•ด์„œ ๊ตฌํ•ด์•ผํ•œ๋‹ค.

  • ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ * ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜ = A*B์ด๋‹ค.

  • ์ฆ‰, ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜ = (A*B)/์ตœ๋Œ€๊ณต์•ฝ์ˆ˜์ด๋‹ค.

#include <iostream>
using namespace std;

int gcd(int a, int b){
    if(b==0)return a;
    else{
        return gcd(b,a%b);
    }
}
int main(){
    int a,b,g,l;
    scanf("%d %d",&a,&b); //์ด ๋‘˜์€ 10,000์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋ฉฐ ์‚ฌ์ด์— ํ•œ ์นธ์˜ ๊ณต๋ฐฑ์ด ์ฃผ์–ด์ง„๋‹ค.

    g=gcd(a,b); //์ตœ๋Œ€๊ณต์•ฝ์ˆ˜
    l=(a*b)/g; //์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜
    printf("%d\n%d",g,l);
}
#include <iostream>
using namespace std;

int gcd(int a, int b){
    if(b==0)return a;
    else{
        return gcd(b,a%b);
    }
}
int main(){
    int a,b,g,l,t;
    scanf("%d",&t);
    while(t--){
        scanf("%d %d",&a,&b); //์ด ๋‘˜์€ 10,000์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋ฉฐ ์‚ฌ์ด์— ํ•œ ์นธ์˜ ๊ณต๋ฐฑ์ด ์ฃผ์–ด์ง„๋‹ค.

        g=gcd(a,b);
        l=(a*b)/g;
        printf("%d\n",l);
    }
}
//์–‘์˜ ์ •์ˆ˜ n๊ฐœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์Œ์˜ GCD์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
#include <iostream>
using namespace std;

int gcd(int a, int b){
    if(b==0)return a;
    else return gcd(b,a%b);
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        int num[101]={0};
        scanf("%d",&n);

        for(int i=0;i<n;i++)scanf("%d",&num[i]);
        long long int sum=0;
        for(int i=0;i<n-1;i++){
            for(int j=i+1;j<n;j++){
                sum+=gcd(num[i],num[j]);
            }
        }
        printf("%lld\n",sum);
    }
}

์ง„๋ฒ• ๋ณ€ํ™˜

10์ง„๋ฒ• ์ˆ˜ N์„ B์ง„๋ฒ•์œผ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด N์ด 0์ด ๋ ๋•Œ๊นŒ์ง€ ๋‚˜๋จธ์ง€๋ฅผ ๊ณ„์†ํ•ด์„œ ๊ตฌํ•˜๋ฉด๋œ๋‹ค.

ex)11์„ 3์ง„๋ฒ•์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•
11/3=3...2
3/3=1...0
1/3=0...1

์ •๋‹ต 102

10 to N

  • 10์ง„๋ฒ• ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ์ˆ˜๋ฅผ B์ง„๋ฒ•์œผ๋กœ ๋ฐ”๊ฟ” ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

  • A: 10, B: 11, ..., F: 16, ..., Y: 34, Z: 35

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main(){
    int n,b;
    scanf("%d %d",&n, &b);
    string ans="";
    while(n>0){
        int r=n%b;
        if(r<10){
            ans+=(char)(r+'0');
        }else{
            ans+=(char)(r-10+'A');
        }
        n/=b;
    }
    reverse(ans.begin(),ans.end());
    cout << ans;
}

B to 10

  • B์ง„๋ฒ• ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ์ˆ˜๋ฅผ 10์ง„๋ฒ•์œผ๋กœ ๋ฐ”๊ฟ” ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

  • A: 10, B: 11, ..., F: 16, ..., Y: 34, Z: 35

#include <iostream>
#include <string>
using namespace std;


int main(){
    int ans=0;
    int b;
    string s;
    cin >> s >> b;
    for(int i=0;i<s.size();i++){
        if('0'<=s[i]&&s[i]<='9'){
            ans=ans*b+s[i]-'0';
        }else{
            ans=ans*b+s[i]-'A'+10;
        }
    }
    printf("%d",ans);
}

2 to 8

  • 2์ง„์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, 8์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

#include <iostream>
#include <string>
using namespace std;
int main() {
    string s;
    cin >> s;
    int n = s.size();
    if (n%3 == 1) {
        cout << s[0];
    } else if (n%3 == 2) {
        cout << (s[0]-'0')*2 + (s[1]-'0');
    }
    for (int i=n%3; i<n; i+=3) {
        cout << (s[i]-'0')*4 + (s[i+1]-'0')*2 + (s[i+2]-'0');
    }
    cout << '\n';
    return 0;
}

8 to 2

  • 8์ง„์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, 2์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
string eight[8] = {"000","001","010","011","100","101","110","111"};
int main(){
    string s;
    cin >> s;
    bool st = false;
    if(s.length() == 1 && s[0]-'0' == 0)cout << "0";
    for(int i = 0;i < s.length();i ++){
        int n = s[i]-'0';
        if(!st && n < 4){
            if(n == 0)    continue;
            else if(n == 1)  cout << "1";
            else if(n == 2)  cout << "10";
            else if(n == 3)  cout << "11";
            st = true;
        }
        else{
            cout << eight[n];
            st = true;
        }
    }
    return 0;
}

8 to -2

  • -2์ง„๋ฒ•์€ ๋ถ€ํ˜ธ ์—†๋Š” 2์ง„์ˆ˜๋กœ ํ‘œํ˜„์ด ๋œ๋‹ค. 2์ง„๋ฒ•์—์„œ๋Š” 20, 21, 22, 23์ด ํ‘œํ˜„ ๋˜์ง€๋งŒ -2์ง„๋ฒ•์—์„œ๋Š” (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8์„ ํ‘œํ˜„ํ•œ๋‹ค. 10์ง„์ˆ˜๋กœ 1๋ถ€ํ„ฐ ํ‘œํ˜„ํ•˜์ž๋ฉด 1, 110, 111, 100, 101, 11010, 11011, 11000, 11001 ๋“ฑ์ด๋‹ค.

  • ๋‚˜๋จธ์ง€๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋ฉด ์•ˆ๋œ๋‹ค.

  • ์–‘์ˆ˜/-2

    • 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ

  • ์Œ์ˆ˜/-2

    • 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ

/*
 8์ง„์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, 2์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
 ์ฒซ์งธ ์ค„์— 8์ง„์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ฃผ์–ด์ง€๋Š” ์ˆ˜์˜ ๊ธธ์ด๋Š” 333,334์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค.
 ์ฒซ์งธ ์ค„์— ์ฃผ์–ด์ง„ ์ˆ˜๋ฅผ 2์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค. ์ˆ˜๊ฐ€ 0์ธ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ฐ˜๋“œ์‹œ 1๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.
*/
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;

int main(){
    int n;
    scanf("%d",&n);
    string ans="";
    if(n==0)printf("%d",n);
    while(n!=1){
        if(n>0){
            if(n%(-2)==0){
                ans+='0';
            }else{
                ans+='1';
            }
        }else{
            if(n%(-2)==0){
                ans+='0';
            }else{
                ans+='1';
                n-=1;
            }
        }
        n/=-2;
    }
    ans+='1';
    reverse(ans.begin(), ans.end());
    cout << ans;
}

A to B

  • A์ง„๋ฒ•์„ B์ง„๋ฒ•์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

  • A์ง„๋ฒ• -> 10์ง„๋ฒ• -> B์ง„๋ฒ•

#include <iostream>
using namespace std;
void convert(int num, int base) {
    if (num == 0) return;
    convert(num/base, base);
    printf("%d ",num%base);
}
int main() {
    int a,b;
    cin >> a >> b;
    int n;
    cin >> n;
    int ans = 0;
    for (int i=0; i<n; i++) {
        int x;
        cin >> x;
        ans = ans * a + x;
    }
    convert(ans,b);
    return 0;
}

์†Œ์ˆ˜

์•ฝ์ˆ˜๊ฐ€ 1๊ณผ ์ž๊ธฐ ์ž์‹  ๋ฐ–์— ์—†๋Š” ์ˆ˜์ด๋‹ค.

N์ด ์†Œ์ˆ˜๊ฐ€ ๋˜๋ ค๋ฉด, 2์ด์ƒ N-1์ดํ•˜์˜ ์ž์—ฐ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด ์•ˆ๋œ๋‹ค.

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ•1

bool prime(int n){
    if(n<2)return false;
    for(int i=2;i<n;i++){
        if(n%i==0)return false;
    }
    return true;
}
  • ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)

๋ฐฉ๋ฒ•2

N์˜ ์•ฝ์ˆ˜ ์ค‘์—์„œ ๊ฐ€์žฅ ํฐ ๊ฒƒ์€ N/2๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— 2์ด์ƒ N/2์ดํ•˜์˜ ์ž์—ฐ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด๋œ๋‹ค.

bool prime(int n){
    if(n<2)return false;
    for(int i=2;i<=n/2;i++){
        if(n%i==0)return false;
    }
    return true;
}
  • ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)

๋ฐฉ๋ฒ•3

N์ด ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, N=a*b ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.(a<=b)

๋‘ ์ˆ˜ a์™€ b์˜ ์ฐจ์ด๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๊ฒฝ์šฐ๋Š” ๋ฃจํŠธ(n) ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ 2์ด์ƒ ๋ฃจํŠธ(n)์ดํ•˜ ์˜ ์ž์—ฐ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ์ˆ˜๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, N=24์ด๋‹ค.

  • N=24์˜ ์•ฝ์ˆ˜ : 1 2 3 4 6 8 12 24

  • 1๊ณผ ์ž๊ธฐ์ž์‹ (24)์ œ์™ธํ•œ ์•ฝ์ˆ˜ : 2 3 4 6 8 12

  • ๋ฃจํŠธ(24) ๋Š” ์•ฝ 4.xxxx์ด๋‹ค. ๋ฃจํŠธ(24)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • 2 3 4 | 6 8 12

  • ๋ฃจํŠธ(24)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž‘์€์ˆ˜์—์„œ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š” ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ํฐ ์ชฝ์—์„œ๋„ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š” ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ธฐ์ค€์—์„œ ์ž‘์€์ˆ˜๋ฅผ ๋น„๊ตํ•ด ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ์ˆ˜๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

bool prime(int n){
    if(n<2)return false;
    for(int i=2;i*i<=n/2;i++){
        if(n%i==0)return false;
    }
    return true;
}
  • ์‹œ๊ฐ„๋ณต์žก๋„ : O(root(n))

์ฃผ์–ด์ง„ ์ˆ˜ N๊ฐœ ์ค‘์—์„œ ์†Œ์ˆ˜๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ ์ฐพ์•„์„œ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

bool prime(int n){
    if(n<2)return false;
    for(int i=2;i*i<=n;i++){
        if(n%i==0)return false;
    }
    return true;
}

int main(int argc, const char * argv[]) {
    int n;
    int num,count = 0;
    scanf("%d",&n);

    while(n--){
        scanf("%d",&i);
        if(prime(num))count++;
    }
    printf("%d",count);
}

์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด

1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋ฒ”์œ„ ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๋ชจ๋“  ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ฐ๊ฐ์˜ ์ˆ˜์— ๋Œ€ํ•ด์„œ ์†Œ์ˆ˜์ธ์ง€ ์•„๋‹Œ์ง€ ๊ฒ€์‚ฌํ•˜๋Š”๋ฐ O(root(N))์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š”๋ฐ, N๊ฐœ๋ฅผ ๊ฒ€์‚ฌํ•ด์•ผํ•˜๋ฏ€๋กœ O(Nroot(N))์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ ๋„ˆ๋ฌด ๊ธด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ๊ตฌํ•œ๋‹ค.

  1. 2๋ถ€ํ„ฐ N๊นŒ์ง€ ๋ชจ๋“  ์ˆ˜๋ฅผ ์จ๋†“๋Š”๋‹ค.

  2. ์•„์ง ์ง€์›Œ์ง€์ง€ ์•Š์€ ์ˆ˜ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.

  3. ๊ทธ ์ˆ˜๋Š” ์†Œ์ˆ˜์ด๋‹ค.

  4. ์ด์ œ ๊ทธ ์ˆ˜์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์šด๋‹ค.

์ด๋ ‡๊ฒŒ ์ง€์šฐ๊ณ  ๋‚จ์•„ ์žˆ๋Š” ์ˆ˜๊ฐ€ ๋ชจ๋‘ ์†Œ์ˆ˜์ด๋‹ค.

๊ตฌํ˜„

int p[100];        //์†Œ์ˆ˜ ์ €์žฅํ•  ๋ฐฐ์—ด
int total_prime = 0; //์†Œ์ˆ˜์˜ ๊ฐœ์ˆ˜
bool c[101];    //์ง€์›Œ์ง€๋ฉด true, ์•„๋‹ˆ๋ฉด false
int n = 100;    //N๊นŒ์ง€์˜ ์ˆ˜
for(int i=2;i<=n;i++){
    if(c[i]==false){
        p[total_prime++]=i;
        for(int j=i*i;j<=n;j+=i)c[j]=true;
    }
}
  • ์‹œ๊ฐ„๋ณต์žก๋„ : O(Nloglog(N))

    • n/2 + n/3 + n/4 + โ€ฆ. = loglog(N)

  • ์ฃผ์˜ํ•  ์  i*i๋Š” N์˜ ๋ฒ”์œ„์— ๋”ฐ๋ผ์„œ i+i๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.(๋ฐฑ๋งŒ์ด์ƒ์ผ ๊ฒฝ์šฐ ๋ฒ”์œ„ ์ดˆ๊ณผ)

M์ด์ƒ N์ดํ•˜์˜ ์†Œ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

#include <iostream>
using namespace std;
#define MAX 1000000
int p[MAX];
int total_prime=0;
bool check_prime[MAX+1];

int main(int argc, const char * argv[]) {

    int n,m;
    scanf("%d %d",&m, &n);

    for(int i=2;i<=n;i++){
        if(check_prime[i]==false){
            if(i>=m){
                p[total_prime++]=i;
                printf("%d\n",i);
            }
            for(int j=i+i;j<=n;j+=i){
                check_prime[j]=true;
            }
        }
    }
}

์ฆ๋ช…์ด ๋˜์ง€ ์•Š์€ ๋ฌธ์ œ์—ฌ์„œ ์ถ”์ธก์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • 2๋ณด๋‹ค ํฐ ๋ชจ๋“  ์ง์ˆ˜๋Š” ๋‘ ์†Œ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • 5๋ณด๋‹ค ํฐ ๋ชจ๋“  ํ™€์ˆ˜๋Š” ์„ธ ์†Œ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • 10^18์ดํ•˜์—์„œ๋Š” ์ฐธ์ธ ๊ฒƒ์ด ์ฆ๋ช…๋˜์–ด ์žˆ๋‹ค.

#include <iostream>
using namespace std;
#define MAX 1000000
int p[MAX];
int total_prime=0;
bool check_prime[MAX+1];

int main(int argc, const char * argv[]) {

    int t;    
    for(int i=2;i<=MAX;i++){
        if(check_prime[i]==false){
            p[total_prime++]=i;
            for(int j=i+i;j<=MAX;j+=i){
                check_prime[j]=true;
        }
    }
    while(1){
        scanf("%d",&t);
        if(t==0)break;
        for(int i=1;i<total_prime;i++){
            if(check_prime[t-p[i]]==false){
                printf("%d = %d + %d\n", t, p[i],t-p[i]);
                break;
            }
        }        
    }
}

์†Œ์ธ์ˆ˜๋ถ„ํ•ด

์ •์ˆ˜ N์„ ์†Œ์ˆ˜์˜ ๊ณฑ์œผ๋กœ ๋ถ„ํ•ดํ•œ ๊ฒƒ์ด๋‹ค.

  • ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜์ง€ ์•Š๊ณ ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  • N์„ ์†Œ์ธ์ˆ˜๋ถ„ํ•ด ํ–ˆ์„ ๋•Œ, ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋Š” ์ธ์ˆ˜ ์ค‘์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์€ ๋ฃจํŠธ(N)์ด๋‹ค.

for(int i=2;i*i<=n;i++){
    while(n%i==0){
        printf("%d\n",i);
        n/=i;
    }
}
if(n>1){
    printf("%d\n",n);
}

ํŒฉํ† ๋ฆฌ์–ผ

N! = 1* 2 * ... * N

ํŒฉํ† ๋ฆฌ์–ผ์€ ๋งค์šฐ ํฐ ๊ฐ’์ด๋‹ค.

03.Recursive์—์„œ ํŒฉํ† ๋ฆฌ์–ผ์„ ์ˆœํ™˜๊ณผ ๋ฐ˜๋ณต์œผ๋กœ ํ’€์–ด๋ณธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํŒฉํ† ๋ฆฌ์–ผ์„ ํ’€ ์ˆ˜ ์žˆ๋Š” ๊ทœ๋ชจ๋Š” 10! = 3628800 ๊นŒ์ง€์ด๋‹ค.

N!์—์„œ 0์ด ๋ช‡๊ฐœ์ธ์ง€ ์•Œ์•„๋‚ด๋Š” ๋ฌธ์ œ์ด๋‹ค.

  • ex) 10! = 3628800

0์ด ๋ช‡๊ฐœ์ธ์ง€๋Š” N!๋ฅผ ์†Œ์ธ์ˆ˜๋ถ„ํ•ด ํ•ด๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  • 10! = 2^6 * 3^4 * 7 * (2^2 * 5^2)

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๊ตฌํ•  ๋•Œ ์†Œ์ธ์ˆ˜๋ถ„ํ•ด๋ฅผ ๋‹ค ํ•  ํ•„์š”๋Š” ์—†๋‹ค. 5์˜ ๊ฐœ์ˆ˜๊ฐ€ ํ•ญ์ƒ 2์˜ ๊ฐœ์ˆ˜๋ณด๋‹ค ์ ๊ธฐ ๋•Œ๋ฌธ์— 5์˜ ๊ฐœ์ˆ˜๋งŒ ์„ธ์–ด์ฃผ๋ฉด๋œ๋‹ค.

N!์˜ 0์˜ ๊ฐœ์ˆ˜ = [N/5]+[N/5^2]+[N/5^3]+โ€ฆ

์˜ˆ๋ฅผ ๋“ค์–ด 100!์ด๋ฉด (100/5 = 20) + (100/25) = 24๊ฐœ์ด๋‹ค.

#include <iostream>
using namespace std;

int main(int argc, const char * argv[]) {
    int n;
    scanf("%d",&n);
    int res = 0;
    for (int i=5; i<=n; i*=5) {
        res += n/i;
    }

    printf("%d",res);
}

nCm์˜ ๋์ž๋ฆฌ 0์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ํŒฉํ† ๋ฆฌ์–ผ์—์„œ๋Š” 2์˜ ๊ฐœ์ˆ˜๊ฐ€ 5์˜ ๊ฐœ์ˆ˜๋ณด๋‹ค ํ•ญ์ƒ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— 5๋งŒ ์„ธ์–ด์คฌ์ง€๋งŒ, ์กฐํ•ฉ์€ ์–ด๋–ป๊ฒŒ ๋ ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— 2์™€ 5์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ชจ๋‘ ์„ธ์–ด์ค˜์•ผํ•œ๋‹ค.

#include <iostream>
using namespace std;

int main(int argc, const char * argv[]) {
    long long  n,m;
    scanf("%lld %lld",&n,&m);
    long long  two=0, fiv=0;
    long long i;
    for (i=2; i<=n; i*=2) {
        two += n/i;
    }
    for (i=2; i<=n-m; i*=2) {
        two -= (n-m)/i;
    }
    for (i=2; i<=m; i*=2) {
        two -= m/i;
    }
    for (i=5; i<=n; i*=5) {
        fiv += n/i;
    }
    for (i=5; i<=n-m; i*=5) {
        fiv -= (n-m)/i;
    }
    for (i=5; i<=m; i*=5) {
        fiv -= m/i;
    }
    if(fiv>two)printf("%lld",two);
    else printf("%d",fiv);
}

Last updated