思路分析:
本题可以分成两种情况,一个是l=r,还有就是了l!=r,
第一种情况:这个人只能在两点之间进行跳跃,看是否能跳跃到所需点
第二种情况:经过画图可以发现,如果左右端点不同,那么这个人就可以每间隔一个点跳跃到一次,因此我们只需要看所需点与开头之间的距离是否是偶数就可以
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int x,y,l,r;
cin>>x>>y>>l>>r;
if(l==r)
{
if(x+l==y||y+l==x) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
else
{
int d=abs(x-y);
if(d%2==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
int main()
{
int t;
cin>>t;
while(t--) solve();
}
思路分析:
一个数字可能会出现多次,因此先记录每个数字出现的次数,组合数找每个数字可以放在的地方
#include<iostream>
#include <map>
using namespace std;
const long long mod = 998244353;
typedef long long ll;
ll qpow(ll a, ll b,ll mod){
ll ans = 1;
a %= mod;
while(b){
if (b & 1) ans = (ans * a) % mod;
b >>= 1;
a = (a * a) % mod;
}
return ans;
}
ll j[1000010];
void jj()
{
j[0]=1;
for(int i=1;i<=1000000;i++)
{
j[i]=j[i-1]*i%mod;
}
}
int n;
void solve()
{
map<int,int> mp;
cin>>n;
for(int i=1,x;i<=n;i++)
{
cin>>x;
mp[x]++;
}
ll ans=j[n];
for(auto i:mp)
{
ans=ans*qpow(j[i.second],mod-2,mod)%mod;//逆元
}
cout<<ans<<endl;
}
int main()
{
int t;
cin>>t;
jj();
while(t--) solve();
}