zoukankan      html  css  js  c++  java
  • 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
    ",cal(n,m));
        }
        return 0;
    }
    View Code
    一步一步,永不停息
  • 相关阅读:
    Codeforces Round #251 (Div. 2) A
    topcoder SRM 623 DIV2 CatAndRat
    topcoder SRM 623 DIV2 CatchTheBeatEasy
    topcoder SRM 622 DIV2 FibonacciDiv2
    topcoder SRM 622 DIV2 BoxesDiv2
    Leetcode Linked List Cycle II
    leetcode Linked List Cycle
    Leetcode Search Insert Position
    关于vim插件
    Codeforces Round #248 (Div. 2) B. Kuriyama Mirai's Stones
  • 原文地址:https://www.cnblogs.com/Willems/p/10924282.html
Copyright © 2011-2022 走看看