結果
| 問題 |
No.117 組み合わせの数
|
| ユーザー |
明智重蔵
|
| 提出日時 | 2015-08-23 17:26:05 |
| 言語 | C#(csc) (csc 3.9.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 5,668 bytes |
| コンパイル時間 | 3,081 ms |
| コンパイル使用メモリ | 112,872 KB |
| 実行使用メモリ | 63,312 KB |
| 最終ジャッジ日時 | 2024-07-18 12:52:28 |
| 合計ジャッジ時間 | 15,532 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | TLE * 1 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
class Program
{
const int DeviVal = 1000000000 + 7;
static string InputPattern = "Input3";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("5");
WillReturn.Add("C(4,2)");
WillReturn.Add("C(5,1)");
WillReturn.Add("P(3,2)");
WillReturn.Add("P(10,10)");
WillReturn.Add("H(3,2)");
//6
//5
//6
//3628800
//6
//条件を満たす組み合わせの数は:
//1番目のクエリは、{1,2},{1,3},{1,4},{2,3},{2,4},{3,4} の6通り
//2番目のクエリは、{1},{2},{3},{4},{5} の5通り
//3番目のクエリは、(1,2),(1,3),(2,1),(2,3),(3,1),(3,2) の6通り
//4番目のクエリは、1から10までを並び替える場合の数と等しいので10!通り
//5番目のクエリは、{1,1},{1,2},{1,3},{2,2},{2,3},{3,3} の6通り
}
else if (InputPattern == "Input2") {
WillReturn.Add("5");
WillReturn.Add("C(1,1000000)");
WillReturn.Add("C(0,0)");
WillReturn.Add("P(1000000,1000000)");
WillReturn.Add("P(1,10)");
WillReturn.Add("H(1,1000)");
//0
//1
//641102369
//0
//1
//1番目のクエリは、10の6乗個の異なる整数を選ぶことは不可能なので,答えは0
//2番目のクエリは、0個の整数を選ぶ方法の数は,何も選ばないという1通り
//3番目のクエリは、答えは mod(10の9乗 +7)で出力することを忘れないで下さい
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
Eratosthenes();
List<string> InputList = GetInputList();
foreach (string EachLine in InputList.Skip(1)) {
Match InsMatch =
Regex.Match(EachLine, @"^([CPH])\(([0-9]+),([0-9]+)\)$");
string Cap1 = InsMatch.Groups[1].Value;
string Cap2 = InsMatch.Groups[2].Value;
string Cap3 = InsMatch.Groups[3].Value;
long Result = 0;
int Param1 = int.Parse(Cap2);
int Param2 = int.Parse(Cap3);
if (Cap1 == "C") Result = CalcC(Param1, Param2);
if (Cap1 == "P") Result = CalcP(Param1, Param2);
if (Cap1 == "H") Result = CalcH(Param1, Param2);
//Console.WriteLine("{0}{1}{2}={2}", Param1, Cap1, Param2, Result);
Console.WriteLine(Result);
}
}
const int Jyougen = 1000000;
static int[] SosuuArr;
//エラトステネスの篩
static void Eratosthenes()
{
var CheckArr = new System.Collections.BitArray(Jyougen + 1);
for (int I = 2; I <= CheckArr.Count - 1; I++) {
CheckArr[I] = true;
}
for (int I = 2; I <= CheckArr.Count - 1; I++) {
if (I != 2 && I % 2 == 0) continue;
if (CheckArr[I]) {
for (int J = I * 2; J <= CheckArr.Count - 1; J += I) {
CheckArr[J] = false;
}
}
}
var SosuuList = new List<int>();
for (int I = 2; I <= CheckArr.Count - 1; I++)
if (CheckArr[I]) SosuuList.Add(I);
SosuuArr = SosuuList.ToArray();
}
//素因数分解した素因数の配列を返す
static int[] DeriveSoinsuuArr(int pTarget)
{
if (Array.BinarySearch<int>(SosuuArr, pTarget) >= 0) {
return new int[] { pTarget };
}
var SoinsuuList = new List<int>();
for (int I = 0; I <= SosuuArr.GetUpperBound(0); I++) {
while (pTarget % SosuuArr[I] == 0) {
SoinsuuList.Add(SosuuArr[I]);
pTarget /= SosuuArr[I];
}
if (pTarget == 1) break;
}
return SoinsuuList.ToArray();
}
//nPkを計算
static long CalcP(int pN, int pK)
{
if (pN == 0) return 1;
if (pN < pK) return 0;
long WillReturn = 1;
for (int I = pN; I >= pN - pK + 1; I--) {
WillReturn = (WillReturn * I) % DeviVal;
}
return WillReturn;
}
//nCkを計算
static long CalcC(int pN, int pK)
{
if (pN == 0) return 1;
if (pN < pK) return 0;
pK = Math.Min(pK, pN - pK);
var ProdList = new List<int>();
var DeviList = new List<int>();
for (int I = pN; I >= pN - pK + 1; I--) {
ProdList.Add(I);
}
for (int I = 1; I <= pK; I++) {
DeviList.AddRange(DeriveSoinsuuArr(I));
}
//分母を全てはらってから、総積をDeviValで割った余りを求める
for (int I = DeviList.Count - 1; 0 <= I; I--) {
for (int J = 0; J <= ProdList.Count - 1; J++) {
if (ProdList[J] % DeviList[I] == 0) {
ProdList[J] /= DeviList[I];
DeviList.RemoveAt(I);
break;
}
}
}
long WillReturn = 1;
ProdList.ForEach(X => WillReturn = (WillReturn * X) % DeviVal);
return WillReturn;
}
//nHkを計算
static long CalcH(int pN, int pK)
{
return CalcC(pN + pK - 1, pK);
}
}
明智重蔵