주어진 문제에서 0과 1로 구성된 문자열이 주어졌습니다. 1로 시작하는 모든 순열의 총 개수를 찾아야 합니다. 대답은 엄청난 숫자일 수 있으므로 모듈로 1000000007을 가져와 출력합니다.
Input : str ="10101001001" Output : 210 Input : str ="101110011" Output : 56
조합 수학을 적용하고 몇 가지 공식을 설정하여 이 문제를 해결할 것입니다.
이 방법에서는 0과 1의 수를 계산합니다. 이제 n은 문자열에 나타나는 1의 수이고, m은 문자열에 나타나는 0의 수이며, L은 주어진 문자열의 길이라고 가정합니다. 따라서 이 문제를 해결하기 위해 공식화하는 공식은 다음과 같습니다. 1 )!/ (n-1)!.
#include <bits/stdc++.h> #define MOD 1000000007 // defining 1e9 + 7 as MOD using namespace std; long long fact(long long n) { if(n <= 1) return 1; return ((n % MOD) * (fact(n-1) % MOD)) % MOD; } int main() { string s = "101110011"; long long L = s.size(); // length of given string long long count_1 = 0, count_0 = 0; // keeping count of 1's and 0's for(auto x : s) { if(x == '1') count_1++; // frequency of 1's else count_0++; // frequency of 0's } if(count_1 == 0){ cout << "0\n"; // if string only consists of 0's so our answer will be 0 } else { long long factL = fact(L-1); // (L-1)! long long factn = fact(count_1 - 1); // (n-1)! long long factm = fact(count_0); // m! long long ans = factL / (factn * factm); // putting the formula cout << ans << "\n"; } return 0; }
56
주어진 프로그램의 시간 복잡도는 O(N)입니다. 여기서 n은 주어진 문자열의 길이입니다.
이 방법에서는 문자열에서 1과 0의 수를 세고 이제 시작 부분에 1을 넣은 다음 길이 L-1과 1 순열의 문자열에서 가능한 모든 0을 공식화합니다. 이 순열을 공식화하면 (L-1)!/(n-1)!*m!의 공식을 얻을 수 있습니다. 여기서 (n-1)!은 나머지 1의 순열입니다.
이 기사에서는 몇 가지 조합론을 적용하고 공식을 공식화하여 1로 시작하는 이진 문자열의 고유 순열 수를 찾는 문제를 해결했습니다.
이 문제를 해결하기 위해 C++ 프로그램과 완전한 방법(일반 방법)도 배웠습니다. C, Java, Python 등과 같은 다른 언어로 동일한 프로그램을 작성할 수 있습니다. 이 기사가 도움이 되기를 바랍니다.
위 내용은 C++로 작성되어 1로 시작하는 이진 문자열의 고유 순열 수를 찾습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!