【SHLQSH数】解题报告

PROBLEM1. SHLQSH


问题描述:

我们把t1, t2 (包括t1, t2 (1<=t1<t2<=10000000))之间的所有数的约数个数和n称为t1, t2shlqsh;

问题是给出数据t1, t2,t1, t2shlqsh数;


输入

输入文件 shlqsh.in仅包含一行,共有两个整数,表示t1t2 (用空格分开)


输出

输出文件shlqsh.out仅有一个整数,表示t1, t2之间的shlqsh数。


输入样例:

26


输出样例:

13

样例说明:(说明部分不必输出)

2的约数有1,2(2)

3的约数有1,3(2)

4的约数有1,2,4(3)

5的约数有1,5(2)

6的约数有1,2,3,6(4)

所以26shlqsh数为13

【数据规模】

对于50%的数据,保证有t1,t2<=5000000

对于全部的数据,保证有t1,t2<=10000000




听说是一道水题,可是我却暴了零。。。早知道向孙松一样分析一下样例说明,说不定就能发现规律了。


一开始是把质数和合数分开来考虑的,首先考虑质数,先用了两个二分确定l到r最小和最大的质数。质数只有两个约数,然后把质数的数量乘以二。

然后考虑所有质数之间的所有合数,这里就弄错了。


正确方法前两天用过,1~t1之间某个约数a的个数就是t1/a,同理1~(t2-1)之间的a的个数就是(t2-1)/a,根据减法原理,t1~t2之间a的个数就是(t2-1)/a+t1/a。然后枚举所有这样的a∈[1,l1]就行了。


这个方法的原理,就是枚举因数,如果枚举合数的话,一个合数可以分解成很多个相同的数,会做重复工作,枚举因数减少了枚举量,降低了时间复杂度。

一开始我想枚举因数,只是我想搜索,然后枚举每一个因数的数量。就是把这个数论知识忘了,所以没有做出来



#include <iostream>
#include <cmath>
using std::cout;
//using std::cin;
#include <cstdio>
const long oo = 0x7fff0000;

long t1;long t2;
long f;long r;
long long ans;

int main()
{
	freopen("shlqsh.in","r",stdin);
	freopen("shlqsh.out","w",stdout);
	
	scanf("%ld%ld",&t1,&t2);
	long ans = 0;
	for (long i=1;i<t1;i++)
	{
		ans-=(t1-1)/i;
	}
	for (long i=1;i<t2+1;i++)
	{
		ans+=t2/i;
	}
	cout << ans << std::endl;
	
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值