Hello 2020
Posted c4lnn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hello 2020相关的知识,希望对你有一定的参考价值。
Solutions
A.New Year and Naming
题意:
思路:
输出 (s[(y-1)\%n]+t[(y-1)\%m]) 即可
代码:
[View Code]
#include<bits/stdc++.h>
using namespace std;
const int N=22;
int n,m;
string s[N],t[N];
int q;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
//freopen("in.txt","r",stdin);
cin>>n>>m;
for(int i=0;i<n;i++) cin>>s[i];
for(int i=0;i<m;i++) cin>>t[i];
cin>>q;
for(int i=1;i<=q;i++)
{
int x;
cin>>x;
x--;
cout<<s[x%n]<<t[x%m]<<endl;
}
return 0;
}
B. New Year and Ascent Sequence
题意:
思路:
定义一个长度为 (l) 的序列中 (a) 存在 (a_i<a_j(1le ile jle l)) 为 (Ascent,Sequence)
对于序列 (p) 和序列 (q),若 (p+q) 为 (Ascent,Sequence) 则为有效组合
问 (n) 个序列中有多少种有效组合
当 (p+q) 为无效组合只有一种情况:(p) 和 (q) 本身都不是 (Ascent,Sequence) 且 (p_{min}>q_{max})
因此对于每个序列只要找出有多少本身不是 (Ascent,Sequence) 的序列的最大值 (le) 该序列最小值的个数
最后答案为 (n^2-) 无效组合数
代码:
[View Code]
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
const int N=1e5+5;
int n;
struct node
{
int minn=INT_MAX;
int maxn=-1;
}state[N];
int vis[N];
int cnt_max[N*10];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
//freopen("in.txt","r",stdin);
cin>>n;
for(int i=0;i<n;i++)
{
int l;
cin>>l;
for(int j=0;j<l;j++)
{
int t;
cin>>t;
if(vis[i]==0)
{
if(t>state[i].minn) vis[i]=1;
state[i].maxn=max(state[i].maxn,t);
state[i].minn=min(state[i].minn,t);
}
}
if(vis[i]==0) cnt_max[state[i].maxn]++;
}
for(int i=1;i<=1000000;i++) cnt_max[i]+=cnt_max[i-1];
ll ans=(ll)n*n;
for(int i=0;i<n;i++) if(vis[i]==0) ans-=cnt_max[state[i].minn];
cout<<ans<<endl;
return 0;
}
C. New Year and Permutation
题意:
思路:
对于一个有 (n) 个不重复数的序列的排列中有多少个区间使 (max{ pl,pl+1,…,pr}?min{ pl,pl+1,…,pr}=r?l)
假设 ([l,r]) 满足上述等式,设 (len=r-l+1),对于此区间,其所有排列均满足上述等式,即有 (len!) 种排列
将此区间看成一个数放入原序列,则原序列中有 (n-len+1) 个数,有 ((n-len+1)!) 种排列
而对于区间长度 (len) 满足 (max{ pl,pl+1,…,pr}?min{ pl,pl+1,…,pr}=r?l) 的共有 (n-len+1) 种情况
所以对于区间长度 (len) 共有 ((n-len+1) imes{len!} imes{(n-len+1)!}),(O(n)) 即可算出结果
代码:
[View Code]
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=250005;
int n,m;
ll fac[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
//freopen("in.txt","r",stdin);
cin>>n>>m;
fac[1]=1;
for(int i=2;i<=n;i++) fac[i]=fac[i-1]*i%m;
ll ans=0;
for(int i=1;i<=n;i++) ans=(ans+fac[i]*fac[n-i+1]%m*(n-i+1)%m)%m;
cout<<ans<<endl;
return 0;
}
以上是关于Hello 2020的主要内容,如果未能解决你的问题,请参考以下文章