解题报告 之 SOJ3191 Free square

解题报告 之 SOJ3191 Free square

Description

Time Limit: 5000 MS    Memory Limit: 65536 K 

Description

A positive integer is said to be squarefree if it is divisible by no perfect square larger than 1. For example, the first few squarefree numbers are {1, 2, 3, 5, 6, 7, 10, 11, 13, 14, 15, 17, 19, ...}. Can you tell me the K-th ( 1-indexed ) smallest squarefree number.

Input

The first line of the input will be a integer to represent the number of test cases. For each test case there is only one line contains only one integer K. ( 1 <= K <= 10^9 ) There is a blank line before each test case.

Output

For each test case output the answer on a single line: The K-th smallest squarefree number.

Sample Input

6 1 2 7 1000 1234567 1000000000

Sample Output

1 2 10 1637 2030745 1644934081

Source

题目大意:非平方构成数定义为一个数不能被任何>1的完全平方数整除,则它为非平方构成数,现在问你第k个非平方构成数是什么?注意k最大为10^9。

分析:这么大的数据,肯定不能一个一个试吧,那么怎么办呢?其实这题是容斥原理,还记得筛选区间内是任意一个素数的倍数的题么?这道题思路异曲同工:先假设区间内所有数都满足条件,然后减去那些是某数的平方倍数的数,再加上同时是某两个平方数倍数的数,再减去同时是三个平方数倍数的数,……。但请注意,这里用于筛选的平方数的选取条件为每个质数作为因子最多出现一次。因为如果某个质因子出现了多次,那么它会造成不必要的重新筛,增加容斥的步骤。

那么我们先取得250内的素数,通过250内的素数去判断500000内的数是应该加还是减还是不关心(取决与其质因子数量)。在1~50000中,如果一个数有重复的质因子,我们则不用它,系数数组co[i]=0;如果一个数有着不重复的奇数个质因子,那么说明容斥时应该减(因为它是平方数),co[i]=-1;如果一个数有着不重复的偶数个质因子,说明容斥时应该加(因为多减了),co[i]=1。

构造好了系数矩阵之后我们就开始容斥以确定某个数之前有多少个非平方构成数。这里因为问的是第几个数是多少,巧妙的使用了二分,如果假设这个数是mid,如果可以满足那么mid容斥完后应该>=k。

最后输出答案的意义即为,<=ans 的数中有k个非平方构成数,那么ans就是第k个非平方构成数。

上代码:

#include<iostream>
#include<algorithm>
using namespace std;

typedef long long ll;
const int MAXN = 4000;
const int MAXM = 100100;

int isprime[MAXN];
int prime[MAXN];
int co[MAXM];
int cnt;

void getP()  //线性素数筛
{
	for(int i = 1; i < MAXN; i++)
		isprime[i] = 1;
	for(int i = 2; i < MAXN; i++)
	{
		if(isprime[i])
			prime[cnt++] = i;
		for(int j = 0; j < cnt&&i*prime[j] < MAXN; j++)
		{
			isprime[i*prime[j]] = 0;
			if(i%prime[j] == 0)
				break;
		}
	}
}

void getCo() //计算素数矩阵
{
	for(int i = 2; i < MAXM; i++)
	{
		co[i] = 1;
		int tem = i;
		for(int j = 0; prime[j] * prime[j] <= tem; j++)
		{
			if(tem%prime[j] == 0)
			{
				co[i] = -co[i];		//找到一个质因子则改变容斥时的加减性
				tem /= prime[j];
			}
			if(tem%prime[j] == 0)
			{
				co[i] = 0;		//不在我们的考虑范围内
				break;
			}
		}
		if(tem > 0&&co[i]!=0) co[i] = -co[i];
	}
}

int main()
{
	int kase, n;
	cin >> kase;
	getP();
	getCo();
	while(kase--)
	{
		cin >> n;
		ll l = 1, r = 2e10;
		ll mid, tem,ans;
		while(l <= r)  //二分数,找到第k个数
		{
			mid = l + (r - l) / 2;
			tem = mid;
			for(long long i = 2; i*i <= mid; i++)
			{
				tem = tem + (mid / (i*i))*co[i];  //mid/(i*i)算出在mid范围内有多少个数能被(i*i)整除,再乘上容斥系数
			}

			if(tem >= n)
			{
				r = mid - 1;
				ans = mid;
			}
			else	l = mid + 1;
		}
		cout << ans << endl;

	}
	return 0;
}

容斥原理果然好难的样子,继续修炼。。

时间: 2024-10-12 06:34:50

解题报告 之 SOJ3191 Free square的相关文章

IOI&#39;96 Magic Square解题报告

IOI‘96 Magic Square(魔版) 题目由JerryXie翻译. Magic Square(msqaure.cpp/c/pas) [问题描述] 在魔方的成功之后,卢比克先生发明了它的二维版本,叫做魔版.它是一个由八个方块组成的表格. 在本题中我们认为每一个方块都有不同的颜色,这些颜色将会用1~8共8个整数表示.一个表格的状态将会以一个由颜色组成的序列表示,顺序是从表格左上角沿顺时针方向给出.比如上面这个表格,序列为(1,2,3,4,5,6,7,8),这被称作初始状态. 魔版有三种基本

解题报告 之 POJ3057 Evacuation

解题报告 之 POJ3057 Evacuation Description Fires can be disastrous, especially when a fire breaks out in a room that is completely filled with people. Rooms usually have a couple of exits and emergency exits, but with everyone rushing out at the same time

解题报告 之 HDU5301 Buildings

解题报告 之 HDU5301 Buildings Description Your current task is to make a ground plan for a residential building located in HZXJHS. So you must determine a way to split the floor building with walls to make apartments in the shape of a rectangle. Each buil

hdu 1541 Stars 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 题目意思:有 N 颗星星,每颗星星都有各自的等级.给出每颗星星的坐标(x, y),它的等级由所有比它低层(或者同层)的或者在它左手边的星星数决定.计算出每个等级(0 ~ n-1)的星星各有多少颗. 我只能说,题目换了一下就不会变通了,泪~~~~ 星星的分布是不是很像树状数组呢~~~没错,就是树状数组题来滴! 按照题目输入,当前星星与后面的星星没有关系.所以只要把 x 之前的横坐标加起来就可以了

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

[noip2011]铺地毯(carpet)解题报告

最近在写noip2011的题,备战noip,先给自己加个油! 下面是noip2011的试题和自己的解题报告,希望对大家有帮助,题目1如下 1.铺地毯(carpet.cpp/c/pas) [问题描述]为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n 张地毯,编号从1 到n.现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上.地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的

ACdream 1203 - KIDx&#39;s Triangle(解题报告)

KIDx's Triangle Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description One day, KIDx solved a math problem for middle students in seconds! And than he created this problem. N

解题报告 之 CodeForces 91B Queue

解题报告 之 CodeForces 91B Queue Description There are n walruses standing in a queue in an airport. They are numbered starting from the queue's tail: the 1-st walrus stands at the end of the queue and the n-th walrus stands at the beginning of the queue.