C++の下記のコードにおいてpow関数をinv関数の手前に置くか直後に置くかで実行結果が変わってしまいます。原因の分かる方はご教示ください。
inv直後に置いた時のコードは以下の通りです。
C++
1#include <bits/stdc++.h> 2 3long long mo=(long long)1e9+7; 4long long fac[200000]; 5long long ifac[200000]; 6 7long long inv(long long a){ 8 return pow(a,mo-2); 9} 10 11long long pow(long long a,long long n){ 12 long long ret=1; 13 for(;n>0;n>>=1,a=a*a%mo){ 14 if(n%2==1){ 15 ret=ret*a%mo; 16 17 } 18 } 19 return ret; 20} 21 22 23void build(){ 24 fac[0]=1; 25 ifac[0]=1; 26 for(int i=1;i<200000;++i){ 27 fac[i]=fac[i-1]*i%mo; 28 ifac[i]=inv(fac[i]); 29 std::cout<<fac[i]*ifac[i]%mo<<std::endl; 30 } 31} 32 33int main(){ 34 build(); 35 return 0; 36}
実行結果は次の通りです。
1 0 0 0 0 0 0 0 0 (略)
一方pow関数をinv関数の手前に置くと、実行結果は以下のようになります。
1 1 1 1 1 1 1 (略)
原因の分かる方がいらっしゃったらご教示ください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。