约瑟夫环——
int cir(int n,int m) { int p=0; for(int i=2;i<=n;i++) { p=(p+m)%i; } return p+1; }
n代表第总人数,m是第几号出局
f(N,M)=(f(N−1,M)+M)%n
解决组合问题圆圈问题
解决组合问题
#include<iostream>
using namespace std;
typedef long long ll;
ll cb[100001];
ll C(ll k, ll n) {//优化
int a = n - k;
int b = k;
if (a > b) {
swap(a, b);
}
long long res = 1;
for (int i = n, j = 1; i > b; i--, j++) {
res *= i;
if (j <= a)res /= j;
}
return res;
}
int main() {
ll t, n, m;
while (cin >> t >> m >> n) {
ll res = 0;
for (int i = 4; i <= t - 1; i++) {
int man = i;
int girl = t - i;
if (man <= n && girl <= m) {
res += C(man, n) * C(girl, m);
}
}
cout << res << "\n";
}
}
m代表取多少个,n是总;
------------------分割线-------------------------------------------------------------------------------------------------
排列问题
#include<iostream>
using namespace std;
typedef long long ll;
ll cb[100001];
ll A(ll k, ll n) {//优化
long long res=1;
for (int i = n; i > n-k; i--)
res *= i;
return res;
}
int main() {
ll t, n, m;
cin >> n >> m;
cout << A(n,m) << endl;
}
------------分割线------------------------
简单快速幂
#include<iostream>
using namespace std;
typedef long long ll;
const long long mod = 1000003;
ll cb[100001];
long long quick(long long a, long long b,long long mod) {
long long ans = 1;
a %= mod;
while (b) {
if (b & 1) {
ans = (ans * a)%mod;
}
a = (a * a)%mod;
b>>=1;
}
return ans;
}
int main() {
ll t, n, m;
cin >> t;
while (t--) {
cin >> n;
long long sum1 = 0;
for (int i = 1; i <= n; i++)
{
long long ans = 1;
long long a, b;
cin >> a >> b;
while (b) {
if (b & 1) ans = ans * a % mod;//如果是偶数直接相乘自己(下面两行都要执行所以每一//步都会b/2)
a = a * a % mod;//如果b是奇数,就乘自己能上b-1
b >>= 1;//b/2
}
sum1 = (sum1 + ans) % mod;
}
cout <<sum1<< endl;
}
}