2024百度之星程序设计大赛初赛第一场

补给

可以O(n^2)做,枚举豁免量

#include<bits/stdc++.h> 
#define int long long
using namespace std;
const int N=1010;
struct Node{
    int p,s;
}node[N];
bool cmp(Node tx,Node ty){
    return tx.p+tx.s<ty.p+ty.s;
}

int n,m;
signed main( )
{
    std::ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>node[i].p>>node[i].s;
    }
    sort(node+1,node+n+1,cmp);int ans=0;
    for(int i=1;i<=n;i++){
        int tem=node[i].p/2+node[i].s;int cnt=1;
        if(tem>m)continue;
        for(int j=1;j<=n;j++){
            if(j==i)continue;
            if(tem+node[j].p+node[j].s<=m){
                tem+=node[j].p+node[j].s;
                cnt++;
            }
        }
        ans=max(ans,cnt);
    }
  cout<<ans;
    return 0;
}

跑步

这oj1e7还是可以线性
这个思路23年也考过,每个i,所有j<i会被追上,相遇lcm/i-lcm/j次
每个i的贡献即为1<=j<=i-1 sum(lcm/i-lcm/j)=lcm(n-2i+1)/i

求lcm,计算每个质因子最多出现次数乘起来 ->质因子欧拉筛
线性求逆元

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=998244353;
const ll p=998244353;
const ll N=1e7+10;
ll n;
ll inv[N];

ll ksm(ll a,ll b){
ll res=1;
a=a%mod;
while(b){
    if(b&1)res=1ll*res*a%mod;
    a=1ll*a*a%mod;
    b>>=1;
}
return res;
}

void get_inv(){
    inv[1]=1;
for(ll i = 2; i <=n; i++){
        inv[i] = 1ll*(p - p / i) * inv[p % i] % p;
  // if(i<=50) cout<<inv[i]<<" "<<ksm(i,p-2)<<endl;逆元是对的
}
}
bool vis[N];ll prime[N];ll tot_prime=0;
void sieve(){
    for(ll i=2;i<=n;i++){
    if(!vis[i])prime[++tot_prime]=i;
 
    for(ll j=1;i*prime[j]<=n;j++){
            vis[i*prime[j]]=true;
            if(i%prime[j]==0)break;
    }
}
}


signed main(){
    std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n;
    get_inv();


    sieve();
    ll lcm=1;
    for(ll i=1;i<=tot_prime;i++){
        ll tem=prime[i];int ci=0;
        while(tem<=1ll*n){
            tem*=prime[i];ci++;
        }
        lcm=lcm*ksm(prime[i],ci)%mod;//必须记录次数之后快速幂
    }

    ll ans=0;
    for(ll i=1;i<=n;i++){
        ans=(ans+1ll*((n-2*i+1)%mod)%mod*inv[i]%mod)%mod;
        //cout<<ans<<'\n';
    }
    ans=ans*lcm%mod;
    cout<<(ans%mod+mod)%mod;
    
}
posted @ 2025-08-10 11:56  arin876  阅读(9)  评论(0)    收藏  举报