結果

問題 No.117 組み合わせの数
ユーザー goodbatongoodbaton
提出日時 2015-08-06 22:25:33
言語 C++11
(gcc 11.4.0)
結果
RE  
実行時間 -
コード長 2,495 bytes
コンパイル時間 610 ms
コンパイル使用メモリ 74,248 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-07-18 03:45:45
合計ジャッジ時間 1,346 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 RE -
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:105:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  105 |     scanf("%d",&t);
      |     ~~~~~^~~~~~~~~
main.cpp:127:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  127 |         scanf(" %c(%d,%d)",&s,&n,&k);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~

ソースコード

diff #

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cstring>

typedef long long ll;
using namespace std;

#define mod 1000000007
#define INF 1000000000
#define LLINF 2000000000000000000LL
#define PI 3.1415926536

#define SIZE 1024

ll gygen[32000];

ll factorial(int n,int M){
    ll ret = 1;
    if(n<=1) return 1;
    
    for(int i=1;i<=n;i++){
        ret = (ret*i)%M;
    }
    
    return ret;
}

ll power(int k,int n,int M){
    if(n==0) return 1;
    if(n==1) return (ll)k;
    
    ll ret = power(k,n/2,M);
    
    ret=(ret*ret)%M;
    
    if(n%2==1)
        ret=(ret*k)%M;
    
    return ret;
}

ll get_gygen(int k){
    if(k < 32000)
        return gygen[k];
    
    for(int j=2;j*j<=k;j++){
        if(k%j){
            return (gygen[j]*gygen[k/j])%mod;
        }
    }
    
    return power(k,mod-2,mod);
}

//nCm (mod p) p is prime number
int C(int n,int m,int M){
    if(n<m) return 0;
    
    if(m==0 || n==m) return 1;
    
    ll chi = factorial(n,M);
    ll mot = (factorial(m,M) * factorial(n-m,M))%M;
    
    
    mot = get_gygen((int)mot);
    
    ll ret = (chi*mot)%M;
    
    return (int)ret;
}

int P(int n,int m,int M){
    if(n<m) return 0;

    if(m==0) return 1;
    
    ll chi = factorial(n,M);
    ll mot = factorial(n-m,M);
    
    
    mot = get_gygen((int)mot);
    
    ll ret = (chi*mot)%M;
    
    return (int)ret;
}

int H(int n,int m,int M){
    if(n==0 && m==0) return 1;
    return C(n+m-1,m,M);
}

int main(){
    int t,n,k;
    char s;
    scanf("%d",&t);
    
    gygen[0]=0;
    gygen[1]=1;
    
    for(int i=2;i<32000;i++){
        bool f = true;
        
        for(int j=2;j*j<=i;j++){
            if(i%j){
                gygen[i] = (gygen[j]*gygen[i/j])%mod;
                f=false;
                break;
            }
        }
        
        if(f){
            gygen[i] = power(i,mod-2,mod);
        }
    }
    
    for(int i=0;i<t;i++){
        scanf(" %c(%d,%d)",&s,&n,&k);
        
        if(s=='C'){
            fprintf(stderr,"C(%d,%d) = ",n,k);
            printf("%d\n",C(n,k,mod));
        }
        if(s=='P'){
            fprintf(stderr,"P(%d,%d) = ",n,k);
            
            printf("%d\n",P(n,k,mod));
        }
        if(s=='H'){
            fprintf(stderr,"H(%d,%d) = ",n,k);
            printf("%d\n",H(n,k,mod));
        }
    }
    
    return 0;
}
0