51nod1026 矩阵中不重复的元素 V2
$n \leq 500000,m \leq 500000$的矩阵,第一行第一列是$a^b,2 \leq a,b \leq 500000$,如果一个数是$i^j$那他右边是$i^{j+1}$,下面是${i+1}^{j}$,问这个矩阵里有多少不同的数字。
把数字化成“基”来统筹统计一些重复情况。意思就是:$a=\prod_{i=1}^{k}p_i^{b_i}$,其中$gcd(b_1,b_2,...,b_k)=1$,那么这些$a$就可以当基,他的若干次幂在比他小的行中一定不会出现,而他的平方,三次方,这些行可能会跟他有部分重复。因此这些行单独拿出来考虑。可以看一下次数:
$a^{1*1} \ \ a^{1*2} \ \ a^{1*3}...$
$a^{2*1} \ \ a^{2*2} \ \ a^{2*3}...$
$a^{3*1} \ \ a^{3*2} \ \ a^{3*3}...$
如此,只需要在这样的矩形里的一段连续行中去重就可以了。一次考虑一个记,元素总数是$log_an*m$的,但总的元素总数仍是$n*m$的。
可以观察到,随着基变大,这个抽象出来的矩形的连续行(叫$[L,R]$)的$L$和$R$都会变小。而这个矩形的数字范围只有$mlogn$,可以开个桶来算每次多出或损失的行。总复杂度变成这个矩形的元素总数$mlogn$。
V3暂时不会QAQ是用容斥的观点进行搜索+剪枝的,希望能回来填坑。
//#include<iostream>
#include<cstring>
#include<cstdio>
//#include<time.h>
//#include<complex>
//#include<set>
#include<queue>
//#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std; #define LL long long
int qread()
{
char c; int s=,f=; while ((c=getchar())<'' || c>'') (c=='-') && (f=-);
do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*f;
} //Pay attention to '-' , LL and double of qread!!!! int n,m,a,b;
#define maxn 1000011
#define maxm 10000011 //int prime[maxn],lp,xx[maxn]; bool notprime[maxn];
//void makeprime(int n)
//{
// lp=0;
// for (int i=2;i<=n;i++)
// {
// if (!notprime[i]) {prime[++lp]=i; xx[i]=i;}
// for (int tmp,j=1;j<=lp && 1ll*i*prime[j]<=n;j++)
// {
// notprime[tmp=i*prime[j]]=1; xx[tmp]=prime[j];
// if (!(i%prime[j])) break;
// }
// }
//} int cnt[maxm]; bool vis[maxn];
int main()
{
m=qread(); n=qread(); a=qread(); b=qread(); int N=a+n-,M=b+m-;
// makeprime(a+n); int L=,R=; while ((<<L)<a) vis[<<L]=,L++; while ((<<R)>N) R--;
// cout<<L<<' '<<R<<endl;
for (int i=L;i<=R;i++) vis[<<i]=;
LL ans=; int now=;
for (int j=L,tmp;j<=R;j++)
for (int k=b;k<=M;k++)
{
if (cnt[tmp=j*k]==) now++;
cnt[tmp]++;
}
ans+=now;
for (int i=;i<=N;i++) if (!vis[i])
{
int nl=,nr=; LL tmp=;
for (;tmp<a;tmp*=i,nl++) vis[tmp]=;
nr=nl; for (;tmp<=N;tmp*=i,nr++) vis[tmp]=; nr--;
// cout<<nl<<' '<<nr<<endl;
for (int j=L-;j>=nl;j--)
for (int k=b;k<=M;k++)
{
if (cnt[tmp=j*k]==) now++;
cnt[tmp]++;
}
L=nl;
for (int j=R;j>nr;j--)
for (int k=b;k<=M;k++)
{
cnt[tmp=j*k]--;
if (cnt[tmp]==) now--;
}
R=nr;
ans+=now;
}
printf("%lld\n",ans);
return ;
}
51nod1026 矩阵中不重复的元素 V2的更多相关文章
- 1007 正整数分组    1010 只包含因子2 3 5的数    1014 X^2 Mod P    1024 矩阵中不重复的元素    1031 骨牌覆盖
		1007 正整数分组 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的. Input 第1行:一个 ... 
- 51nod 1024 矩阵中不重复的元素
		1024 矩阵中不重复的元素 题目来源: Project Euler 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 一个m*n的矩阵. 该矩阵的 ... 
- [51NOD1024] 矩阵中不重复的元素(数学,精度)
		题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1024 因为n和m都到100了,所以直接快速幂硬算一定会爆炸,考 ... 
- 51Nod 1024 矩阵中不重复的元素 | 技巧 数学
		first try: set<LL> sset; int main() { LL m,n,a,b; while(~scanf("%lld%lld%lld%lld",&a ... 
- Java基础知识强化之集合框架笔记27:ArrayList集合练习之去除ArrayList集合中的重复字符串元素
		1. 去除ArrayList集合中的重复字符串元素(字符串内容相同) 分析: (1)创建集合对象 (2)添加多个字符串元素(包含重复的) (3)创建新的集合 (4)遍历旧集合,获取得到每一个元素 (5 ... 
- linq 根据指定条件返回集合中不重复的元素
		原理:先查询出数据,根据指定值分组,然后取第一条映射 1.第一种方法 string sql = string.Format("select*from PoliceLogistcs); db. ... 
- c编程:求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。
		//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max, ... 
- 有序矩阵中第k小元素
		有序矩阵中第k小元素 题目: 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素. 看到有序就会想 ... 
- javascript 返回数组中不重复的元素
		这是实现结构伪类type-of-type的部分代码: <script type="text/javascript"> var ret= ["span" ... 
随机推荐
- make 与makefile(会不会写 makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。)
			跟我一起写 Makefile /**/ 陈皓 (CSDN) 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉 ... 
- 迅为iMX6Q/PLUS开发板烧写设备树内核 Qt 系统
			迅为iMX6Q 和 iMX6PLUS 两个硬件版本,设备树镜像的烧写方法以及镜像所在目录,镜像名称全部一致. 如果用的是 iMX6Q 版本,想要烧写设备树版本镜像,请使用 iMX6Q 设备树版本的光盘 ... 
- 复合词UVa10391(STL简单应用)
			一.题目 输入一系列由小写字母组成的单词.输入已按照字典序排序(这句话就是个陷阱),且不超过120000个.找出所有的复合词,即恰好由两个单词连接而成的单词. 二.解题思路 要么枚举两两拼接的情况,O ... 
- k8s 如何 Failover?
			上一节我们有 3 个 nginx 副本分别运行在 k8s-node1 和 k8s-node2 上.现在模拟 k8s-node2 故障,关闭该节点. 等待一段时间,Kubernetes 会检查到 k8s ... 
- SayLove微信小程序
			目录 SayLove 表白墙微信小程序 程序结构 说明 程序效果图 配置过程 结语 云开发 quickstart 参考文档 SayLove 表白墙微信小程序 项目地址:https://github.c ... 
- mac文件夹怎么重命名?苹果电脑文件夹重命名快捷键
			windows系统下给文件夹重命名相信很多朋友都很熟悉,那么Mac OS系统怎么给文件重命名呢,相信很多刚刚入手Mac OS系统的亲们都会有次疑问,下面小编告诉你Mac OS系统的文件夹到底要怎样才能 ... 
- java数字金额转化为中文金额
			public static String digitUppercase(double n){String fraction[] = {"角", "分"};Str ... 
- 使用Xcode连接开源中国
			故事背景: 今天加入一个新的项目组,其实也就是包括我在内就两个人,由于对方在开源中国上建的项目我没法使用. 所以由我接手第一个任务:就是在开源中国上搭建git项目组 前提条件:xcode和 Git(h ... 
- 【数位dp】bzoj1833: [ZJOI2010]count 数字计数
			数位dp姿势一直很差啊:顺便庆祝一下1A Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a ... 
- rz
			Linux系统简单易用的上传下载命令rz和sz sudo yum install lrzsz -y 上传:rz 下载:sz 
