题目描述

杜老师可是要打+∞年World Final的男人,虽然规则不允许,但是可以改啊!

但是今年WF跟THUSC的时间这么近,所以他造了一个idea就扔下不管了……

给定L,R,求从L到R的这R−L+1个数中能选出多少个不同的子集,满足子集中所有的数的乘积是一个完全平方数。特别地,空集也算一种选法,定义其乘积为1。

由于杜老师忙于跟陈老师和鏼老师一起打ACM竞赛,所以,你能帮帮杜老师写写标算吗?

输入格式

从标准输入读入数据。

每个测试点包含多组测试数据。

输入第一行包含一个正整数 T(1≤T≤100),表示测试数据组数。

接下来T行,第i+1行两个正整数Li,Ri表示第 i 组测试数据的 L,R ,保证1≤Li≤Ri≤107。

输出格式
输出到标准输出。

输出T​行,每行一个非负整数,表示一共可以选出多少个满足条件的子集,答案对998244353​取模。


$R_{i} \le 1e7$ , $T \le 100$ , $\sum_{i=1}^{T}(R_{i}-L{i}+1) \le 6e7$

  • 题解

    • 唯一分解,把每个质数看成一个元,$mod2$意义下高斯消元设自由元个数为$d$
    • 答案就是线性相关的子集数$=2^d$;
    • 暴力$50$
    • 在$L,R$比较大的时候,直接消元会很浪费,考虑剪枝;
    • 如果$[L,R]$中出现了质因子$p$;
    • 一 ,若 $p > \sqrt R$则$p$对应位一定有基;  ->  $p^k>R  \  (k>1)$
    • 二 ,若$ p <= \lfloor \frac{R}{L} \rfloor $ 则$p$对应位一定有基;->  $( B(L) xor  B(L*p) == B(p) )$,说明$p$独立
    • 三, 若$R-L>=6e3$,则$p$对应位一定有基;  ->  ????  如果有人知道为什么的话求教
    • 大于根号的因子只有一个,特判一的;
    • 所以近距离暴力高斯消元,远距离直接计算;
    • $trick$ :线筛每个数的因子可$logR$分解因数 ,$bitset$优化,同时线性基满了就不再插入;
    • $O(R \ + \  \sum R_{i}-L_{i}  \ + \ T*(\frac{R}{64} + 6e3*log \ R) )$
    •  #include<bits/stdc++.h>
      #define ll long long
      using namespace std;
      const int N=,M=1e7+,mod=;
      int T,L[],R[],n,k,size,pos[N];
      int pt,pr[M],vis[M],v[M],visT[M];
      typedef bitset<> BIT;
      BIT B[],now,pre;
      struct data{
      int x,y;
      bool operator <(const data&A)const{
      return y < A.y;
      }
      }A[N];
      int pw2(int y){
      int re=,x=;
      for(int i=y;i;i>>=,x=(ll)x*x%mod){
      if(i&)re=(ll)re*x%mod;
      }
      return re;
      }
      void get_fac(int x,BIT&y){
      y.reset();
      if(v[x]>k)x/=v[x];
      while(x!=){
      int t=v[x],cnt=;
      while(x%t==&&(x/=t))cnt++;
      if(cnt&)y[pos[t]]=;
      }
      }
      bool ins(BIT&x){
      for(int i=;i<size;i++)if(x[i]){
      if(B[i][i])x^=B[i];
      else return B[i]=x,true;
      }
      return false;
      }
      void solve1(int l,int r){
      int tot=,cnt=,tot2=;
      for(int i=l;i<=r;i++)A[++cnt]=(data){i,v[i]};
      sort(A+,A+cnt+);
      for(int i=;i<size;i++)B[i].reset();
      for(int i=;i<=cnt;i++){
      get_fac(A[i].x,now);
      if(A[i].y<=k){if(tot<size)tot+=ins(now);}
      else if(A[i].y!=A[i-].y){tot2++;pre=now;}
      else {now^=pre;if(tot<size)tot+=ins(now);}
      }
      // printf("%d %d\n",tot,tot2);
      printf("%d\n",pw2(r-l+-tot-tot2));
      }
      void solve2(int l,int r){
      int tot=;
      for(int i=l;i<=r;i++)if(v[i]>k&&visT[v[i]]!=T){
      visT[v[i]]=T;
      tot++;
      }
      for(int i=;i<=size;i++)if((l-)/pr[i]<r/pr[i]&&visT[pr[i]]!=T){
      visT[pr[i]]=T;
      tot++;
      }
      printf("%d\n",pw2(r-l+-tot));
      }
      int main(){
      freopen("T2.in","r",stdin);
      freopen("T2.out","w",stdout);
      scanf("%d",&T);
      for(int i=;i<=T;i++)scanf("%d%d",&L[i],&R[i]),n=max(n,R[i]);
      k=sqrt(n); v[]=;
      for(int i=;i<=n;i++){
      if(!vis[i]){
      v[pr[++pt]=i]=i;
      if(i<=k)size++,pos[i]=pt-;
      }
      for(int j=;j<=pt&&i*pr[j]<=n;j++){
      vis[i*pr[j]]=;
      v[i*pr[j]]=v[i];
      if(i%pr[j]==)break;
      }
      }
      for(int i=;T;i++,T--){
      if(R[i]-L[i]>=)solve2(L[i],R[i]);
      else solve1(L[i],R[i]);
      }
      return ;
      }

      THUSC2017D1T2

【THUSC2017】杜老师的更多相关文章

  1. [THUSC2017]杜老师:bitset+线性基

    算法一(50pts) 分析 有一个很显然的暴力做法,对于区间内的每个数开个bitset,然后暴力分解质因数.如果对于一个数,它的一个质因子的指数是奇数,那么就把bitset的对应位设成\(1\).答案 ...

  2. 【THUSC2017】【LOJ2978】杜老师 高斯消元

    题目大意 给你 \(l,r\),求从 \(l\) 到 \(r\) 这 \(r-l+1\) 个数中能选出多少个不同的子集,满足子集中所有的数的乘积是一个完全平方数. 对 \(998244353\) 取模 ...

  3. LOJ #2978「THUSCH 2017」杜老师

    听说LOJ传了THUSC题赶紧上去看一波 随便点了一题都不会做想了好久才会写暴力爆了一发过了... LOJ #2978 题意 $ T$次询问,每次询问$ L,R$,问有多少种选取区间中数的方案使得选出 ...

  4. 洛谷 P4948 拉格朗日多项式插值(杜老师板子)

    https://www.luogu.org/problemnew/show/P4948 这篇博客主要目的是存一下的dls的神奇板子,本来应该是推公式或者二分做的 但是dls的插值板子直接写好了这个特殊 ...

  5. THUSC 2017 D1T2 杜老师

    这是个非常有趣的数学题啦... 其实大概推一推式子就能得到一个信息,就是答案一定是$2$的整数次幂,并且其实答案就是$2^{R-L+1-sum}$,其中$sum$表示有多少个数不能用$L-i-1$的数 ...

  6. loj#2978. 「THUSCH 2017」杜老师(乱搞)

    题面 传送门 题解 感谢yx巨巨 如果一个数是完全平方数,那么它的所有质因子个数都是偶数 我们把每一个数分别维护它的每一个质因子的奇偶性,那么就是要我们选出若干个数使得所有质因子的个数为偶数.如果用线 ...

  7. LOJ 2978 「THUSCH 2017」杜老师——bitset+线性基+结论

    题目:https://loj.ac/problem/2978 题解:https://www.cnblogs.com/Paul-Guderian/p/10248782.html 第 i 个数的 bits ...

  8. [loj2978]杜老师

    假设所有素数从小到大依次为$p_{1},p_{2},...,p_{k}$,我们将$x$转换为一个$k$位的二进制数,其中从低到高第$i$位为1当且仅当其$p_{i}$的幂次为奇数 不难发现以下两个性质 ...

  9. 洛谷 P7451 - [THUSCH2017] 杜老师(线性基+根分+结论题)

    题面传送门 看到乘积为平方数我们可以很自然地想到这道题,具体来说,我们对 \(1\sim 10^7\) 中所有质因子标号 \(1,2,\cdots,\pi(10^7)\),对于 \(x\in[l,r] ...

随机推荐

  1. 基于Python的信用评分卡模型分析(二)

    上一篇文章基于Python的信用评分卡模型分析(一)已经介绍了信用评分卡模型的数据预处理.探索性数据分析.变量分箱和变量选择等.接下来我们将继续讨论信用评分卡的模型实现和分析,信用评分的方法和自动评分 ...

  2. DDMS_Threads的简单使用

    title: DDMS_Threads的简单使用 date: 2016-07-20 00:44:35 tags: [DDMS] categories: [Tool,IDE] --- 概述 本文记录在 ...

  3. 工作小应用:EXCEL查找两列重复数据

    工作案例:excel存在A列.B列,需要找出B列没有A列的数据,具体做法如下(以office2007做案例): 1.点击 公式-定义名称 ,选中A列,填写名称“AAA”,选中B列,填写名称“BBB”: ...

  4. 三维空间中xoy平面上特定抛物线的正等测投影解析解的一种求法

    背景 背景:为锻炼代同学,老师给了她一个反向工程微信"跳一跳"小游戏的任务,希望做一个一样的出来.跳一跳中,有方块,有小人,小人站在方块上. 这个游戏的玩法是,用手指按住手机屏幕, ...

  5. 2017年软件工程第十二次作业-PSP总结报告

    回顾1 1.回想一下你曾经对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么? 你认为过去接触到的课程是否符合你对计算机专业的期待,为什么?经过一个学期 ...

  6. 2018-2019-20172329 《Java软件结构与数据结构》第八周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第八周学习总结 现在对于我而言,最珍贵的是时间,感觉自己在时间飞逝的时候真的挽留不住什么,只能怒发冲冠的让自己疯狂的学习 ...

  7. Java每日编程day2

    Java每日编程day2 第一题 package com.pcx.day2; /* * 九九乘法表并逆序 */ public class JiuJiu { public static void mai ...

  8. IT职业道路的苦与甜

    每当有人问起你学的是什么专业啊?学的怎么样啊?好不好学啊?等等一些类似的问题.我都会默默的说一句,会者不难,难者不会.当然现在的我还处于菜鸟级别,不过我相信在不久后的一天我一定会脱离菜鸟的行列,然后挺 ...

  9. 【CSAPP笔记】1. 位、字节、整型

    <Computer Systems a Programmer's Perspective>,机械工业出版社.中文译名<深入理解计算机系统>.作者:(美)Randal E.Bry ...

  10. 实现二叉树(search)

    ★实验任务 可怜的 Bibi 刚刚回到家,就发现自己的手机丢了,现在他决定回头去搜索 自己的手机. 现在我们假设 Bibi 的家位于一棵二叉树的根部.在 Bibi 的心中,每个节点 都有一个权值 x, ...