結果
| 問題 |
No.391 CODING WAR
|
| コンテスト | |
| ユーザー |
suikameron1
|
| 提出日時 | 2018-10-28 19:14:37 |
| 言語 | C#(csc) (csc 3.9.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,347 bytes |
| コンパイル時間 | 1,224 ms |
| コンパイル使用メモリ | 111,748 KB |
| 実行使用メモリ | 27,596 KB |
| 最終ジャッジ日時 | 2024-11-19 07:13:47 |
| 合計ジャッジ時間 | 2,521 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 RE * 1 |
| other | AC * 6 RE * 10 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;
using System.Linq;//リストの使用
using System.Collections.Generic;
class Program
{
static string[] input = Console.ReadLine().Split(' ');//Splitで区切り文字を指定して複数個受け取る。
static long n = long.Parse(input[0]);
static long k = long.Parse(input[1]);
static long p = 1000000007;
static long answer = 0;
static long[] factorials = new long[n+1];//i!(mod p)を先にメモ
static long[] factorialRs = new long[n+1];//i!^-1(mod p), pは素数
static void Main()
{
factorials[0] = 1;
factorialRs[n] = DivideModFactorial(n,p);
for(long i = 1; i <= n; i++)
{
factorials[i] = (factorials[i-1]*i)%p;//i!(mod p)
factorialRs[n-i] = (factorialRs[n+1-i]*(n+1-i))%p;//逆元も先にメモ
}
if(k > n) answer = 0;
else
{
for(long i = 0; i <= k-1; i++)
{
long memo = Comb(k, i, p) * DivideMod(k-i, n, p);
if(i % 2 == 0)
{
answer += memo;
answer %= p;
}else
{
answer -= memo;
answer %= p;
if(answer < 0) answer += p;
}
}
}
Console.WriteLine(answer);//WriteLineをWriteとすると、改行なしで出力。
}
static long DivideMod(long x, long a, long p)//戻り値はx^a(mod p)
{
long num = 2;
long answer = 1;
long check = a;
long memo = x%p;
while(check > 0)
{
if(check % num == num / 2)
{
check -= num / 2;
answer *= memo;
answer %= p;
}
memo *= memo;
memo %= p;
num *= 2;
}
return answer;
}
static long DivideModReverse(long x, long p)//戻り値はx^-1(mod p), pは素数
{
long answer = DivideMod(x, p-2, p);
return answer;
}
static long DivideModFactorial(long x, long p)//戻り値はx!^-1(mod p), pは素数
{
long answer = 1;
for(long i = x; i >= 2; i--)
{
answer *= DivideModReverse(i, p);
answer %= p;
}
return answer;
}
static long Comb(long a, long b, long p)//戻り値は組み合わせC(a,b)のmod p
{
long answer = 1;
answer *= factorials[a];
answer %= p;
answer *= factorialRs[a-b];//引数a-bは負にならないようにする
answer %= p;
answer *= factorialRs[b];
answer %= p;
return answer;
}
}
suikameron1