https://codeforces.ml/contest/1445/problems
A水题,但注意要全部读入完成再输出结果
B,阅读理解
C 寻找一个X可以被Q整除却不能被P整除的最大X
逆向思维,X其实是Q除去某个数,除去之后的数不能是P的倍数,所以应该是比P少一个质因子
需要注意的是,在筛除的过程中,只需要找到根号,因为比根号大的质因子只有一个,懒得筛质因子就筛所有因子。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
inline void slove(){
ll p,q;
scanf("%lld%lld",&p,&q);
ll odd = q;
if(p % q){
printf("%lld\n",p);
return ;
}
ll ans = 0;
for(ll i = 2;i * i <= q;i ++){
ll t = p;
while(t % i == 0){
t /= i;
if(t % q){
ans = max(t,ans);
break;
}
}
while(odd % i == 0) odd /= i;
}
ll t = p;
if(odd != 1){
while(t % odd == 0){
t /= odd;
if(t % q){
ans = max(ans,t);
break;
}
}
}
printf("%lld\n",ans);
}
int main(){
int _;scanf("%d",&_);
while(_--)slove();
}
D、绝对值的题
绝对值的题,一般是固定那个较大的值,以此来去掉绝对值
对于此题,可以看出
f
f
f是横值,只需要计算组合数即可
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int Mn = 3e5 + 5;
ll a[Mn];
const ll mod = 998244353;
ll Qpow(ll a,ll b){
ll ans = 1,base = a;
while(b){
if(b & 1) {
ans *= base;
ans %= mod;
}
base *= base;
base %= mod;
b>>= 1;
}
return ans;
}
ll f[Mn];
int main()
{
ll n;scanf("%lld",&n);
f[0] = 1;
for(ll i = 1;i <= 2 * n;i ++){
scanf("%lld",a + i);
f[i] = f[i - 1] * i;
f[i] %= mod;
}
ll x,b;
x = f[2 * n];
// for(int i = 1;i <= 10;i ++) cout<<Qpow(2,i);
b = Qpow(f[n] * f[n] % mod,mod - 2);
ll ans = 0;
sort(a + 1,a + 1 + 2 * n);
for(int i = n + 1;i <= 2 * n;i ++) ans += a[i];
for(int i = 1;i <= n;i ++) ans -= a[i];
ans %= mod;
ans *= (x * b) % mod;
ans %= mod;
printf("%lld",ans);
return 0;
}