题目大意

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

  对 \(998244353\) 取模。

  \(1\leq l,r\leq {10}^7\)

  有 \(100\) 组数据,\(\sum r-l+1\leq 6\times {10}^7\)

题解

  对于每个数,求出这个数中包含了哪些出现次数为奇数的质数。

  那么就可以直接高斯消元,记矩阵的秩为 \(r\),答案就是 \(2^{r-l+1-r}\)。可以用 bitset 优化。

  时间复杂度为 \(O(\frac{n\pi(n)^2}{w})\)。

  可以发现,一个数最多有一个 \(>\sqrt r\) 的质因子。那么对于两个最大值因子相同的数,可以让第二个数的状态异或上第一个数的状态,这样第二个数的状态就只有 \(\leq \sqrt r\) 的质因子了。

  这样就可以让矩阵的列的数量降低到 \(\pi(\sqrt n)\)。

  但是还是过不了这题。

  可以发现,当 \(r-l+1\) 足够大的时候就可以认为这个矩阵满秩了。在本题中,当 \(r-l+1>6000\) 的时候就可以不用高斯消元直接求出答案了。

  时间复杂度:\(O(\frac{T\times 6000\times \pi(\sqrt n)^2}{w})\)。

  这个复杂度很松,实际跑起来非常快。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<functional>
#include<cmath>
#include<vector>
#include<assert.h>
#include<bitset>
using namespace std;
using std::min;
using std::max;
using std::swap;
using std::sort;
using std::reverse;
using std::random_shuffle;
using std::lower_bound;
using std::upper_bound;
using std::unique;
using std::vector;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
typedef std::pair<int,int> pii;
typedef std::pair<ll,ll> pll;
void open(const char *s){
#ifndef ONLINE_JUDGE
char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
void open2(const char *s){
#ifdef DEBUG
char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
int rd(){int s=0,c,b=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c=='-'){c=getchar();b=1;}do{s=s*10+c-'0';}while((c=getchar())>='0'&&c<='9');return b?-s:s;}
void put(int x){if(!x){putchar('0');return;}static int c[20];int t=0;while(x){c[++t]=x%10;x/=10;}while(t)putchar(c[t--]+'0');}
int upmin(int &a,int b){if(b<a){a=b;return 1;}return 0;}
int upmax(int &a,int b){if(b>a){a=b;return 1;}return 0;}
const ll p=998244353;
const int N=10000010;
const int n=10000000;
const int sqrtn=3162;
const int size=446;
typedef bitset<500> arr;
ll fp(ll a,ll b)
{
ll s=1;
for(;b;b>>=1,a=a*a%p)
if(b&1)
s=s*a%p;
return s;
}
int c[N],d[N],b[N],pri[N],cnt;
void sieve()
{
c[1]=1;
for(int i=2;i<=n;i++)
{
if(!b[i])
{
pri[++cnt]=i;
d[i]=cnt;
c[i]=i;
}
for(int j=1;j<=cnt&&i*pri[j]<=n;j++)
{
int v=i*pri[j];
b[v]=1;
c[v]=c[i];
if(i%pri[j]==0)
break;
}
}
}
void init()
{
sieve();
}
arr get(int x)
{
while(c[x]>sqrtn)
x/=c[x];
arr res;
while(x>1)
{
res.flip(d[c[x]]-1);
x/=c[x];
}
return res;
}
int len,tot,tot2;
void solve2(int l,int r)
{
tot=0;
len=r-l+1;
for(int i=1;i<=cnt;i++)
if(r/pri[i]!=(l-1)/pri[i])
tot++;
ll ans=fp(2,len-tot);
printf("%lld\n",ans);
}
arr e[size];
int insert(arr v)
{
for(int i=0;i<size;i++)
if(v[i])
{
if(e[i][i])
v^=e[i];
else
{
e[i]=v;
return 1;
}
}
return 0;
}
pii a[10000];
arr pre;
int cmp(pii a,pii b)
{
return a.second<b.second;
}
void solve()
{
int l,r;
scanf("%d%d",&l,&r);
if(r-l>6000)
{
solve2(l,r);
return;
}
tot=0;
tot2=0;
len=r-l+1;
if(l==1)
l++;
int m=0;
for(int i=0;i<size;i++)
e[i].reset();
for(int i=l;i<=r;i++)
a[++m]=pii(i,c[i]);
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++)
if(a[i].second<=sqrtn)
{
if(tot<size)
if(insert(get(a[i].first)))
tot++;
}
else if(i==1||a[i].second!=a[i-1].second)
{
tot2++;
if(tot<size)
pre=get(a[i].first);
}
else
{
if(tot<size)
if(insert(get(a[i].first)^pre))
tot++;
}
ll ans=fp(2,len-tot-tot2);
printf("%lld\n",ans);
}
int main()
{
open("dls");
init();
int t;
scanf("%d",&t);
while(t--)
solve();
return 0;
}

【THUSC2017】【LOJ2978】杜老师 高斯消元的更多相关文章

  1. 【THUSC2017】杜老师

    题目描述 杜老师可是要打+∞年World Final的男人,虽然规则不允许,但是可以改啊! 但是今年WF跟THUSC的时间这么近,所以他造了一个idea就扔下不管了…… 给定L,R,求从L到R的这R− ...

  2. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  3. 【BZOJ-3270】博物馆 高斯消元 + 概率期望

    3270: 博物馆 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 292  Solved: 158[Submit][Status][Discuss] ...

  4. *POJ 1222 高斯消元

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9612   Accepted: 62 ...

  5. [bzoj1013][JSOI2008][球形空间产生器sphere] (高斯消元)

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...

  6. hihoCoder 1196 高斯消元·二

    Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...

  7. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

  8. SPOJ HIGH Highways ——Matrix-Tree定理 高斯消元

    [题目分析] Matrix-Tree定理+高斯消元 求矩阵行列式的值,就可以得到生成树的个数. 至于证明,可以去看Vflea King(炸树狂魔)的博客 [代码] #include <cmath ...

  9. UVALive 7138 The Matrix Revolutions(Matrix-Tree + 高斯消元)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

随机推荐

  1. [Vue] vuex进行组件间通讯

    vue 组件之间数据传输(vuex) 初始化 store src/main.js import Vuex from "vuex"; Vue.use(Vuex); new Vue({ ...

  2. 一次 C# 查詢數據庫 算法優化的案例

    最近有次在修改某段程式時,發現一段程式算法看起來簡單. 但背後因為多次查詢數據庫,導致效能問題. 這段程式主要是利用 EPPLUS 讀取 Excel 資料,檢查資料是否已存在數據庫中,若有就將已存在的 ...

  3. alias,data,系统定时开关机的基本操作

    1.修改命令提示符的格式,及每个字母所代表的功能,显示提示符格式输入echo $PS1PS1="[\u@\h \W]\$"\e 或\033启用颜色 \u当前用户 \h主机名简称 \ ...

  4. 如何在sublime text3运行nodejs

    步骤一:nodejs的安装1到nodejs的官网下载安装包,直接点击Install即可.(参照自己的系统版本安装,官网会自动匹配系统的版本.) 2双击安装包,进行安装 3务必注意的地方:安装路径,要记 ...

  5. npm ERR! asyncWrite is not a function

    1.背景:原先node是官网下载安装的,通过brew更新了下,然后到项目里npm i 安装包时候,报错2.解决:卸载官网下载安装的node,重装 sudo rm -rf /usr/local/{bin ...

  6. Docker-Dockerfile及基本语法

    Dockerfile的作用是通过它可以生成自定镜像,先介绍几个基本的docker命令. [docker镜像相关的命令]docker search 镜像名: 搜索镜像docker pull 镜像名: 镜 ...

  7. 利用ZYNQ SOC快速打开算法验证通路(6)——LWIP实现千兆TCP/IP网络传输

    一.前言 之前ZYNQ与PC之间的网络连接依赖于外接硬件协议栈芯片,虽然C驱动非常简单,但网络带宽受限.现采用LWIP+PS端MAC控制器+PHY芯片的通用架构.关于LWIP库,已经有很多现成的资料和 ...

  8. memcached架构及缓存策略

    ----------------------------------------概述---------------------------------------- Memcached是一套高性能分布 ...

  9. vmware 14 新安装centos7 没法联网

    vmware14 刚安装好centos7后,想下载安装一些软件发现无法联网,于是就百度了一下.下面 记录下解决方法. 1 确报主机能上网. 2 设置虚拟机网络适配器 3 设置虚拟机网卡 4 修改cen ...

  10. cent os 7 与cent os 6 修改主机名称

    centos6 需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.零时修改用hostname your-name cnet ...