zoukankan      html  css  js  c++  java
  • hdu6273 Master of GCD---差分

    题目链接:https://vjudge.net/problem/HDU-6273#author=614984177

    题意:一开始数列全为1,m次操作,每次把区间[l,r]内的数乘2或乘3,求最后所有数的最大公约数

    17杭州ccpc的一道简单题。可以求出对于每个位置的数,乘了多少个2和3,这个可以令区间[l,r]全部+1得到,由于是最后询问gcd,所以可以用差分。最后统计2和3的最少因子数num2和num3,则2^num2*3^num3就是答案

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    
    const int N=1e5+10;
    const int mod=998244353;
    int d2[N],d3[N],c2[N],c3[N];
    int t,n,m,i,j,k,num2,num3;
    
    ll qpow(ll b,ll p){
    	ll res=1;
    	while (p){
    	  if (p&1) res=res*b%mod;
    	  b=b*b%mod;
    	  p>>=1;
    	}
    	return res%mod;
    } 
    
    int main(){
    	scanf("%d",&t);
    	while (t--){
    	  memset(d2,0,sizeof(d2));
    	  memset(d3,0,sizeof(d3));
    	  c2[0]=c3[0]=0; 
    	  scanf("%d%d",&n,&m);
    	  for (i=1;i<=m;i++){
    	  	int l,r,x;
    	  	scanf("%d%d%d",&l,&r,&x);
    	  	if (x==2){d2[l]++;d2[r+1]--;}
    		else {d3[l]++;d3[r+1]--;}
    	  }
    	  num2=num3=1e7;
    	  for (i=1;i<=n;i++) {
    	  	c2[i]=c2[i-1]+d2[i]; c3[i]=c3[i-1]+d3[i]; 
    	  	num2=min(num2,c2[i]); num3=min(num3,c3[i]);
    	  }
    	  ll ans=qpow(2,num2)*qpow(3,num3)%mod;
    	  printf("%lld
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    弹飞绵羊
    POJ 3308
    狼抓兔子
    块状链表题*1
    块状链表
    双向链表
    Linux入职基础-1.2_U盘安装RedHat5具体步骤
    Linux入职基础-1.1_国内开源的主要镜像站
    VS.NET(C#)--2.9_HTML服务器控件案例
    VS2015按钮方法
  • 原文地址:https://www.cnblogs.com/edmunds/p/13692207.html
Copyright © 2011-2022 走看看