#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//-----------------------------------------------------------------
// Pandita's algorithm to generate next lexicographic permutation
bool next_permutation(char *L, int n) {
// Step 1: find rightmost position i such that L[i] < L[i+1]
int i = n - 2;
while ((i >= 0) && (L[i] >= L[i+1])) i--;
if (i==-1) return false;
// Step 2: find rightmost position j to the right of i such that L[j] > L[i]
int j = i + 1;
while ((j < n) & (L[j] > L[i])) j += 1;
j -= 1;
// Step 3: swap L[i] and L[j]
char tmp = L[i];
L[i] = L[j];
L[j] = tmp;
// Step 5: reverse everything to the right of i
int left = i + 1;
int right = n - 1;
while (left < right) {
tmp = L[left];
L[left] = L[right];
L[right] = tmp;
left += 1;
right -= 1;
}
return true;
}
//-----------------------------------------------------------------
int main(){
char L[] = "00000000001111111111";
int count_in_church = 0;
int total_permutations = 0;
while (1) {
total_permutations += 1;
// check if bride steps into church by checking if
// the number of ones exceeds the number of zeros
int cnt_0 = 0;
int cnt_1 = 0;
for (int i=0; i<n; i++) {
char c = L[i];
if (c == '0') cnt_0 += 1;
else cnt_1 += 1;
if (cnt_1 > cnt_0) {
count_in_church += 1;
break;
}
}
if (!next_permutation(L,n)) break;
}
printf("number of times bride entered church: %d\n", count_in_church
); printf("total permutations: %d\n", total_permutations
);
float ratio = 1.0 * count_in_church / total_permutations;
printf("probability: %f\n", ratio
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIFBhbmRpdGEncyBhbGdvcml0aG0gdG8gZ2VuZXJhdGUgbmV4dCBsZXhpY29ncmFwaGljIHBlcm11dGF0aW9uCgpib29sIG5leHRfcGVybXV0YXRpb24oY2hhciAqTCwgaW50IG4pIHsKICAvLyBTdGVwIDE6IGZpbmQgcmlnaHRtb3N0IHBvc2l0aW9uIGkgc3VjaCB0aGF0IExbaV0gPCBMW2krMV0KICBpbnQgaSA9IG4gLSAyOwogIHdoaWxlICgoaSA+PSAwKSAmJiAoTFtpXSA+PSBMW2krMV0pKSBpLS07CiAgaWYgKGk9PS0xKSByZXR1cm4gZmFsc2U7CiAgCiAgLy8gU3RlcCAyOiBmaW5kIHJpZ2h0bW9zdCBwb3NpdGlvbiBqIHRvIHRoZSByaWdodCBvZiBpIHN1Y2ggdGhhdCBMW2pdID4gTFtpXQogIGludCBqID0gaSArIDE7CiAgd2hpbGUgKChqIDwgbikgJiAoTFtqXSA+IExbaV0pKSBqICs9IDE7CiAgaiAtPSAxOwogIAogIC8vIFN0ZXAgMzogc3dhcCBMW2ldIGFuZCBMW2pdCiAgY2hhciB0bXAgPSBMW2ldOwogIExbaV0gPSBMW2pdOwogIExbal0gPSB0bXA7CiAgCiAgLy8gU3RlcCA1OiByZXZlcnNlIGV2ZXJ5dGhpbmcgdG8gdGhlIHJpZ2h0IG9mIGkKICBpbnQgbGVmdCA9IGkgKyAxOwogIGludCByaWdodCA9IG4gLSAxOwogCiAgd2hpbGUgKGxlZnQgPCByaWdodCkgewogICAgdG1wID0gTFtsZWZ0XTsKICAgIExbbGVmdF0gPSBMW3JpZ2h0XTsKICAgIExbcmlnaHRdID0gdG1wOwogICAgbGVmdCArPSAxOwogICAgcmlnaHQgLT0gMTsKICB9CiAgICAgICAgICAgICAKICByZXR1cm4gdHJ1ZTsKfQoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmludCBtYWluKCl7CiAgY2hhciBMW10gPSAiMDAwMDAwMDAwMDExMTExMTExMTEiOwogIGludCBuID0gc3RybGVuKEwpOwogIAogIGludCBjb3VudF9pbl9jaHVyY2ggPSAwOwogIGludCB0b3RhbF9wZXJtdXRhdGlvbnMgPSAwOwogIAogIHdoaWxlICgxKSB7CiAgICAKICAgIHRvdGFsX3Blcm11dGF0aW9ucyArPSAxOwogICAgLy8gY2hlY2sgaWYgYnJpZGUgc3RlcHMgaW50byBjaHVyY2ggYnkgY2hlY2tpbmcgaWYKICAgIC8vIHRoZSBudW1iZXIgb2Ygb25lcyBleGNlZWRzIHRoZSBudW1iZXIgb2YgemVyb3MKICAgIGludCBjbnRfMCA9IDA7CiAgICBpbnQgY250XzEgPSAwOwogICAgCiAgICAKICAgIGZvciAoaW50IGk9MDsgaTxuOyBpKyspIHsKICAgICAgY2hhciBjID0gTFtpXTsKICAgICAgaWYgKGMgPT0gJzAnKSBjbnRfMCArPSAxOwogICAgICBlbHNlIGNudF8xICs9IDE7CiAgICAKICAgICAgaWYgKGNudF8xID4gY250XzApIHsKICAgICAgICBjb3VudF9pbl9jaHVyY2ggKz0gMTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIAogIAogICAgaWYgKCFuZXh0X3Blcm11dGF0aW9uKEwsbikpIGJyZWFrOwogIH0KICAKICAKICBwcmludGYoIm51bWJlciBvZiB0aW1lcyBicmlkZSBlbnRlcmVkIGNodXJjaDogJWRcbiIsIGNvdW50X2luX2NodXJjaCk7CiAgcHJpbnRmKCJ0b3RhbCBwZXJtdXRhdGlvbnM6ICVkXG4iLCB0b3RhbF9wZXJtdXRhdGlvbnMpOwoKICBmbG9hdCByYXRpbyA9IDEuMCAqIGNvdW50X2luX2NodXJjaCAvIHRvdGFsX3Blcm11dGF0aW9uczsKICBwcmludGYoInByb2JhYmlsaXR5OiAlZlxuIiwgcmF0aW8pOwoKCXJldHVybiAwOwp9Cg==