A题 :
题意:给出 n , m n,m n,m,求 ( n ! ) ! (n!)!%m (n!)!
做法:如果 n ! ≥ m n!\geq m n!≥m 则直接输出 0 0 0,不然就正常运算。
代码如下:
/*
coder:sunshine
school:njupt
*/
#include <bits/stdc++.h>
#define endl '\n' //交互题删掉
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int N = 1e6 + 10;
ll t, m, z, now;
ll d[N];
void solve()
{
int n;
cin >> n;
if (n >= z)
{
cout<<0<<endl;
}
else
{
cout << d[d[n]] % m << endl;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> t >> m;
d[0] = 1;
now = 1;
z=0;
for (int i = 1; i <= N; i++)
{
d[i] = d[i - 1] * i % m;
now *= i;
if (now >= m && !z)
{
z = i;
}
}
while (t--)
{
solve();
}
return 0;
}
B题:
题目做法:构造题,将 Q p 1 Q_{p1} Qp1赋成1,然后正常排列就可以了。
代码如下:
/*
coder:sunshine
school:njupt
*/
#include <bits/stdc++.h>
using namespace std;
#define endl '\n' //交互题删掉
#define x first
#define y second
typedef long long ll;
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int N=5e5+10;
int a[N],b[N];
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=0;
}
int c=a[1];
b[c]=1;
int cnt=1;
for(int i=1;i<=n;i++)
{
if(b[i]) continue;
cnt++;
b[i]=cnt;
}
for(int i=1;i<=n;i++)
{
cout<<b[i]<<" ";
}
cout<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
D题:
做法:可以发现不管怎么操作,0和1的数量都不会变,所以求字典序最小,就是贪心的把1放到最后,前面全是0。
代码如下:
/*
coder:sunshine
school:njupt
*/
#include <bits/stdc++.h>
using namespace std;
#define endl '\n' //交互题删掉
#define x first
#define y second
typedef long long ll;
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int N = 5e5 + 10;
int a[N], c[N];
int t, n;
int b(int x)
{
return (1 << (x - 1));
}
void solve()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
c[i] = 0;
}
for (int i = 1; i <= 30; i++)
{
int k = 0;
for (int j = 1; j <= n; j++)
{
if (a[j] & b(i))
k++;
}
for (int j = 1; j <= k; j++)
{
c[n + 1 - j] |= b(i);
}
}
for (int i = 1; i <= n; i++)
{
cout << c[i] << " ";
}
cout << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> t;
while (t--)
{
solve();
}
return 0;
}