質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1160閲覧

C++で関数を配置する順序によって実行結果が変化する

ruei

総合スコア284

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/01/26 13:00

編集2019/01/26 13:01

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 (略)

原因の分かる方がいらっしゃったらご教示ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

long long inv(long long a){
return pow(a,mo-2);
}

powが後にあると、標準Cライブラリのpowが呼ばれてるんじゃないかしら。

投稿2019/01/26 13:04

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

関数は呼び出す前に宣言が必要です。
標準のpow関数とのからみでおかしな事になっていると思います。

名前をpow2とかにすると、宣言・定義を後ろに書くとエラーになると思います。

投稿2019/01/26 13:11

otn

総合スコア84551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問