ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P4240 毒瘤之神的考验

2019-05-25 22:39:33  阅读:354  来源: 互联网

标签:pre mu phi int rep 毒瘤 define 之神 P4240


题目: https://www.luogu.org/problemnew/show/P4240

 

解:神仙 题  化出了式子了 还要会构造函数,构造了函数 还要会实现。  牛逼儿~~~   ( 出处:https://www.cnblogs.com/y2823774827y/p/10235949.html

 

 

 

 

#include<bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define dep(i,j,k) for(int i=k;i>=j;i--)
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define make(i,j) make_pair(i,j)
#define pb push_back
using namespace std;
const int block=35;
const int N=1e5+9;
const LL p=998244353;
bool vis[N];
int mu[N],phi[N],pre[N];
int *G[N],*S[block+1][block+1],F[N];
int inv[N],tot;
void init() {
    mu[1]=phi[1]=inv[1]=1;
    rep(i,2,100000) {
        if(!vis[i]) {
            pre[++tot]=i; mu[i]=-1; phi[i]=i-1;
        }
        rep(j,1,tot) {
            if(i*pre[j]>100000) break;
            vis[i*pre[j]]=true;
            if(i%pre[j]==0) {
                phi[i*pre[j]]=phi[i]*pre[j]; break;
            }
            else {
                phi[i*pre[j]]=phi[i]*phi[pre[j]];
                mu[i*pre[j]]=-mu[i];
            }
        }
    }
    rep(i,2,100000) inv[i]=p-1LL*p/i*inv[p%i]%p;
    rep(i,1,100000) {
        for(int j=1;j*i<=100000;j++) {
            F[i*j]=1LL*(1LL*F[i*j]+1LL*i*inv[phi[i]]%p*mu[j]%p)%p;
        }
    }
    rep(i,1,100000) {
        G[i]=new int [N/i+1];
        G[i][0]=0;
        rep(j,1,100000/i) {
            G[i][j]=1LL*(1LL*G[i][j-1]+1LL*phi[i*j])%p;
        }
    }
    rep(j,1,block) {
        rep(k,1,block) {
            int len(100000/(max(k,j)));
            S[j][k]=new int [len+1];
            S[j][k][0]=0;
            rep(i,1,len) {
                S[j][k][i]=1LL*(1LL*S[j][k][i-1]+1LL*F[i]*G[i][j]%p*G[i][k]%p)%p;
            }
        }
    }
}
LL cal(int n,int m) {
    if(n>m) swap(n,m);
    LL ans=0;
    for(int i=1;i<=m/block;i++) ans=(ans+1LL*F[i]*G[i][n/i]%p*G[i][m/i]%p)%p;
    for(int l=m/block+1,r;l<=n;l=r+1) {
        r=min(n/(n/l),m/(m/l));
        ans=(ans+1LL*(S[n/l][m/l][r]-S[n/l][m/l][l-1]+p)%p)%p;
    }
    return ans;
}
int main() {
    init();
    int t;
    scanf("%d",&t);
    while(t--) {
        int n,m;
        scanf("%d %d",&n,&m);
        printf("%lld\n",cal(n,m));
    }
    return 0;
}
View Code

 

标签:pre,mu,phi,int,rep,毒瘤,define,之神,P4240
来源: https://www.cnblogs.com/Willems/p/10924282.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有