結果
| 問題 |
No.389 ロジックパズルの組み合わせ
|
| コンテスト | |
| ユーザー |
ku_material_ro
|
| 提出日時 | 2016-10-22 03:29:21 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,999 bytes |
| コンパイル時間 | 643 ms |
| コンパイル使用メモリ | 64,380 KB |
| 実行使用メモリ | 15,152 KB |
| 最終ジャッジ日時 | 2024-11-23 17:03:52 |
| 合計ジャッジ時間 | 142,879 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 55 WA * 1 TLE * 43 |
ソースコード
#include <iostream>
#include <math.h>
#include <string>
#include <algorithm>
using namespace std;
int kaijo(long a){
long n=1;
if (a > 0){
for (long i = a; i > 0; i--){
n *= i;
n = n % 1000000007;
}
}
else{
n = 1;
}
return n;
}
int permtation(long a,long b){
long n = 1;
if (b != 0){
for (long i = 0; i < b; i++){
n *= (a-i);
n = n % 1000000007;
}
}
else{
n = 1;
}
return n;
}
int main(){
long m;
long p1;
long a = 0;
long sho;
long amari;
long cnt2=0;
string s;
string s1;
long h;
long cnt = 0;
long ans;
long p, k;
int flag=0;
cin >> m;
cin.ignore();
getline(cin, s);
if (s == "0") flag = 1;
while (1){
s1 = s;
//cout << s1 << endl;
a = s1.find(" ", 0);
if (a == -1){
h = stoi(s1);
m -= h;
cnt++;
break;
}
else{
s1.erase(a,s1.length());
h = stoi(s1);
m -= h;
cnt++;
s.erase(0, a + 1);
//cout << s << endl;
}
}
long judge = m - cnt + 1;
//cout << m << endl;
//cout << cnt << endl;
//cout << judge << endl;
if (flag == 1){
cout << "1" << endl;
}else if (judge <0){
cout << "NA" << endl;
}
else{
if (judge>cnt){
p = permtation(m + 1, cnt);
k = kaijo(cnt);
while (1){
ans = p / k;
if (ans*k == p){
cout << ans << endl;
break;
}
else{
if (p <k){
p1 = p;
while (1){
sho = (k - p1) / (1000000007 / k);
amari = (k - p1) %(1000000007 / k);
if (amari == 0){
cnt2 += sho;
break;
}
else{
cnt2 += sho + 1;
p1 = (p1 + (sho + 1) * 1000000007 / k) - k;
}
}
p += 1000000007 * cnt2;
}
if (p >k){
p1 = p-k;
while (1){
sho = (k - p1) / (1000000007 / k);
amari = (k - p1) % (1000000007 / k);
if (amari == 0){
cnt2 += sho;
break;
}
else{
cnt2 += sho + 1;
p1 = (p1 + (sho + 1) * 1000000007 / k) - k;
}
}
p += 1000000007 * cnt2;
}
}
}
}
else{
p = permtation(m + 1, judge);
k = kaijo(judge);
while (1){
ans = p / k;
if (ans*k == p){
cout << ans << endl;
break;
}
else{
if (p <k){
p1 = p;
while (1){
sho = (k - p1) / (1000000007 / k);
amari = (k - p1) % (1000000007 / k);
if (amari == 0){
cnt2 += sho;
break;
}
else{
cnt2 += sho + 1;
p1 = (p1 + (sho + 1) * 1000000007 / k) - k;
}
}
p += 1000000007 * cnt2;
}
if (p >k){
p1 = p - k;
while (1){
sho = (k - p1) / (1000000007 / k);
amari = (k - p1) % (1000000007 / k);
if (amari == 0){
cnt2 += sho;
break;
}
else{
cnt2 += sho + 1;
p1 = (p1 + (sho + 1) * 1000000007 / k) - k;
}
}
p += 1000000007 * cnt2;
}
}
}
}
//ans = kaijo(m + 1) / (kaijo(m - cnt + 1)*kaijo(cnt));
//cout << ans << endl;
//cout << m << endl;
}
return 0;
}
ku_material_ro