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)์ด๋ผ๊ณ ํ๋ค.
2๋ถํฐ min(A,B)๊น์ง ๋ชจ๋ ์ ์๋ก ๋๋์ด๋ณด๋ ๋ฐฉ๋ฒ
์ ํด๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(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))์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฏ๋ก ๋๋ฌด ๊ธด ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ผ๋ก ๊ตฌํ๋ค.
2๋ถํฐ N๊น์ง ๋ชจ๋ ์๋ฅผ ์จ๋๋๋ค.
์์ง ์ง์์ง์ง ์์ ์ ์ค์์ ๊ฐ์ฅ ์์ ์๋ฅผ ์ฐพ๋๋ค.
๊ทธ ์๋ ์์์ด๋ค.
์ด์ ๊ทธ ์์ ๋ฐฐ์๋ฅผ ๋ชจ๋ ์ง์ด๋ค.

์ด๋ ๊ฒ ์ง์ฐ๊ณ ๋จ์ ์๋ ์๊ฐ ๋ชจ๋ ์์์ด๋ค.
๊ตฌํ
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
Was this helpful?