• 2017CCPC 杭州 J. Master of GCD【差分标记/线段树/GCD】


    给你一个n个初始元素都为1的序列和m个询问q。
    询问格式为:l r x(x为2or3)
    最后求1~n所有数的GCD
    GCD:把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数。

    #include<cstdio>
    #include<string>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    #include<cstring>
    #include<set>
    #include<queue>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<cctype>
    #include<stack>
    #include<sstream>
    #include<list>
    #include<assert.h>
    #include<bitset>
    #include<numeric>
    #define debug() puts("++++")
    #define gcd(a,b) __gcd(a,b)
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define fi first
    #define se second
    #define pb push_back
    #define sqr(x) ((x)*(x))
    #define ms(a,b) memset(a,b,sizeof(a))
    #define sz size()
    #define be begin()
    #define pu push_up
    #define pd push_down
    #define cl clear()
    #define lowbit(x) -x&x
    #define all 1,n,1
    #define mod 998244353
    
    #define pi acos(-1.0)
    #define rep(i,x,n) for(int i=(x); i<(n); i++)
    using namespace std;
    typedef long long LL;
    typedef unsigned long long ULL;
    typedef pair<int,int> P;
    const int INF = 1<<30;
    const int maxn = 1e5+3;
    const double eps = 1e-8;
    const int dx[] = {-1,1,0,0,1,1,-1,-1};
    const int dy[] = {0,0,1,-1,1,-1,1,-1};
    int dir[2]={-1,1};
    const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    LL t,n,m;
    LL Pow(LL a, LL b)
    {
        LL res=1;
        while(b)
        {
            if(b&1)
                res=(res%mod * a%mod)%mod;
            a = a%mod*a%mod;
            b>>=1;
        }
        return res%mod;
    }
    LL a[maxn],b[maxn];
    int main()
    {
        scanf("%lld",&t);
        while(t--)
        {
            ms(a,0),ms(b,0);
            scanf("%lld%lld",&n,&m);
            while(m--)
            {
                LL l,r,x;
                scanf("%lld%lld%lld",&l,&r,&x);
                if(x==2)
                {
                    a[l]++,a[r+1]--; //差分标记因子含有2的数、区间加维护2or3的操作数
                }
                else
                {
                    b[l]++,b[r+1]--;
                }
            }
            LL m1=a[1],m2=b[1];
            for(int i=2;i<=n;i++)
            {
                a[i]+=a[i-1]; //前缀和维护序列本身,而序列记录2的操作数即个数,得到具体每个数的操作数
                b[i]+=b[i-1];
                m1=min(m1,a[i]); //2的最小操作数
                m2=min(m2,b[i]);
            }
            LL ans = (Pow(2,m1)%mod*Pow(3,m2)%mod)%mod;
            printf("%lld
    ",ans);
        }
    }
    /*
    2
    5 3
    1 3 2
    3 5 2
    1 5 3
    6 3
    1 2 2
    5 6 2
    1 6 2
    
    6 2
    【题意】
    
    【类型】
    
    【分析】
    
    【时间复杂度&&优化】
    
    【trick】
    
    【数据】
    
    */
    
  • 相关阅读:
    php RSA加密传输代码示例
    数据库执行语句时,严重注意类型转换的问题
    数据库sql的in操作,解决in的过多
    php利用自定义key,对数据加解密的方法
    修改目录下所有文件的某段内容
    ajax返回json时,js获取类型,是字符串类型
    浅析单点登录,以及不同二级域名下的SSO实现
    samba服务,连接远程开发机
    『转』统计一个日志文件里,单词出现频率的shell脚本
    python的装饰器
  • 原文地址:https://www.cnblogs.com/Roni-i/p/9527250.html
Copyright © 2020-2023  润新知