# 수학
이 문제의 경우 값이 크다보니 %연산을 하면서 나누기를 진행 하여야 하는데,
이 과정에서 문제가 발생하게 된다.
페르마의 소정리를 알고 풀어야 할 것 같다.
m이 소수라는 가정하에 기존의 나누기를 곱셈으로 변환하여 해결 하면된다.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <math.h>
#include <queue>
#include <set>
#include <list>
#include <utility>
#include <functional>
#define MAX 1000005
#define INF 987654321
#define MOD 1000000007
#pragma warning(disable:4996)
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
typedef pair<float, float> pf;
ll n,m,ans=1,divi=1;
ll fun(ll a,ll b)
{
ll ret=1;
while(b>0)
{
ll tmp=1,cur=a;
while(tmp*2<b)
{
cur=(cur*cur)%MOD;
tmp*=2;
}
ret=(ret*cur)%MOD;
b-=tmp;
}
return ret;
}
// a^b % MOD 해주는 함수.
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=m;i>0;i--,n--)
{
ans*=n,divi*=i;
ans%=MOD,divi%=MOD;
}
printf("%lld",(ans*fun(divi,MOD-2))%MOD);
}'IT > BOJ' 카테고리의 다른 글
| 백준(BOJ) 14921 용액 합성하기 ** (0) | 2018.06.13 |
|---|---|
| 백준(BOJ) 14919 분포표 만들기 ** (0) | 2018.06.13 |
| 백준(BOJ) 14621 나만 안되는 연애 ** (0) | 2018.06.03 |
| 백준(BOJ) 15787 기차가 어둠을 헤치고 은하수를 ** (0) | 2018.06.02 |
| 백준(BOJ) 11726 2*n 타일링 ** (0) | 2018.06.01 |