zoukankan      html  css  js  c++  java
  • 2017中国大学生程序设计竞赛-杭州站 : Master of GCD(差分)

     

     

    题意分析:

    初始数组中的数都为1,每次选一个区间[l, r], 使该区间中的数乘2或3, 最后求所有数的最大公约数。

    解题思路:

    因为2和3最大公约数为1, 所以如果要求所有数的最大公约数,那么就是所有数都乘的一个数,也就是说,如果他们的最大公约数是2,那么所有的数都一定乘过2.

    记录所有数乘2和乘3的最小次数,答案为pow(2, min2)* pow(3, min3)% MOD

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #define N 100020
    const int MOD = 998244353;
    using namespace std;
    int a[N], b[N];
    long long pow_(long long a, int b)
    {
    	long long c=1;
    	while(b) {
    		if(b%2==1)
    			c=(c*a)%MOD;
    		b/=2;
    		a=(a*a)%MOD;
    	}
    	return c;
    }
    int main()
    {
    	int T, n, m, l ,r, v, mina, minb;
    	scanf("%d", &T);
    	while(T--)
    	{
    		scanf("%d%d", &n, &m);
    		memset(a, 0, sizeof(a));
    		memset(b, 0, sizeof(b));
    		while(m--) {
    			scanf("%d%d%d", &l, &r, &v);
    			if (v==2) {
    				a[l]++;
    				a[r+1]--;
    			}
    			else {
    				b[l]++;
    				b[r+1]--;
    			}
    		}
    		mina=a[1];
    		minb=b[1];
    		for (int i=2; i<=n; i++) {
    			a[i]+=a[i-1];
    			b[i]+=b[i-1];
    			mina = min(mina, a[i]);
    			minb = min(minb, b[i]);
    		}
    		printf("%lld
    ", (1ll*pow_(2, mina) * pow_(3, minb)) % MOD);
    	}
    	return 0;
    } 
    
    /*
    2
    5 3
    1 3 2
    3 5 2
    1 5 3
    
    6 3
    1 2 2
    5 6 2
    1 6 2
    */
  • 相关阅读:
    Storm中的定时任务
    Storm的acker确认机制
    ORACLE数据库表解锁record is locked by another user
    Java生成某段时间内的随机时间
    Linux中断概述
    Linux内核同步:RCU
    Linux内核同步:自旋锁
    Linux软中断、tasklet和工作队列
    Linux信号机制
    缺页异常处理
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/11852505.html
Copyright © 2011-2022 走看看