Codeforces Round #680(数学题,约数 绝对值)

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;
}

猜你喜欢

转载自blog.csdn.net/qq_45673816/article/details/114119108