【数学 技巧】divisor
没考虑重复lcm处理被卡TLE没A真是可惜
题目大意
$n$为$k-可表达的$当且仅当数$n$能被表示成$n$的$k$个因子之和,其中$k$个因子允许相等。
求$[A,B]$之间$k-可表达$的数的个数
$T \le 5*10^4,2 \le K \le 7,1 \le A \le B \le 10^{18}$
题目分析
每一种拆分可以视作$1=\frac{1}{a}+\frac{1}{b}+...$的形式。因为K相当小,可以先搜出每个$K$下的拆分情况,问题就转化成了求$[l,r]$之间有多少数至少是其中一个的倍数——这是一个相当经典的问题。
但是这题的数据范围要求进一步细节优化。
注意到在极限数据$K=7,T=5*10^4$下,纯粹地$2^{因数}$枚举每一种情况lcm的做法相当低效。通过观察/经验会发现,这$2^{因数}$个lcm有大量是重复的。那么我们就转而保存每个lcm的系数而非把lcm全部存下来。
这是一个计算倍数容斥问题时,显著而不甚易想起的优化。
代码很丑。没心情重构。
#include<bits/stdc++.h>
const int ass5[] = {, , , , , , };
const int ass6[] = {, , , , , , };
const int ass7[] = {, , , , , , , , , , , , , , , };
typedef long long ll; int T;
ll l,r,k,gmpAss5[],gmpAss6[],gmpAss7[]; ll read()
{
char ch = getchar();
ll num = , fl = ;
for (; !isdigit(ch); ch = getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch = getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
int gcd(int a, int b){return !b?a:gcd(b, a%b);}
ll assp5(ll x)
{
ll ret = ;
for (int i=; i<; i++)
ret += x/gmpAss5[i];
return ret;
}
ll assp6(ll x)
{
ll ret = ;
for (int i=; i<; i++)
ret += x/gmpAss6[i];
return ret;
}
ll assp7(ll x)
{
ll ret = ;
for (int i=; i<=gmpAss7[]; i++)
if (gmpAss7[i]) ret += x/gmpAss7[i];
return ret;
}
void makeAss5()
{
for (int i=, ass=; i<(<<(ass)); i++)
{
ll dt = , lst = , del;
for (int j=, t=i; j<=ass; j++, t>>=)
if (t&){
++dt, del = gcd(lst, ass5[j]);
lst *= ass5[j]/del;
}
gmpAss5[i] = (dt&)?lst:-lst;
}
}
void makeAss6()
{
for (int i=, ass=; i<(<<(ass)); i++)
{
ll dt = , lst = , del;
for (int j=, t=i; j<=ass; j++, t>>=)
if (t&){
++dt, del = gcd(lst, ass6[j]);
lst *= ass6[j]/del;
}
gmpAss6[i] = (dt&)?lst:-lst;
}
}
void makeAss7()
{
ll &tot = gmpAss7[];
for (int i=, ass=; i<(<<(ass)); i++)
{
ll dt = , lst = , del;
for (int j=, t=i; j<=ass; j++, t>>=)
if (t&){
++dt, del = gcd(lst, ass7[j]);
lst *= ass7[j]/del;
}
lst = (dt&)?lst:-lst;
bool chk = ;
for (int i=; i<=tot&&chk; i++)
if (gmpAss7[i]==-lst) gmpAss7[i] = , chk = ;
if (chk) gmpAss7[++tot] = lst;
}
}
ll calc(ll x, ll k)
{
ll ret = ;
if (k==) return x;
if (k==) return x>>;
if (k==) return (x/+x/-x/);
if (k==) return (x/+x/+x/-x/-x/-x/+x/);
if (k==) return assp5(x);
if (k==) return assp6(x);
if (k==) return assp7(x);
return ret;
}
void write(ll x){if (x/) write(x/);putchar(x%+'');}
int main()
{
makeAss5(), makeAss6(), makeAss7();
for (scanf("%d",&T); T; --T)
{
l = read(), r = read(), k = read();
write(calc(r, k)-calc(l-, k)), putchar('\n');
}
return ;
}
END
【数学 技巧】divisor的更多相关文章
- 丑数<数学技巧>
题意:丑数就是质因子只有2,3,5 ,7,的数,另外1也是丑数.求第n(1=<n<=5842)个丑数,n=0,结束. 思路:.3.5或者7的结果(1除外).那么,现在最主要的问题是如何排序 ...
- nyoj--1170--最大的数(数学技巧)
最大的数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 小明和小红在打赌说自己数学学的好,于是小花就给他们出题了,考考他们谁NB,题目是这样的给你N个 ...
- hdu 5675 ztr loves math(数学技巧)
Problem Description ztr loves research Math.One day,He thought about the "Lower Edition" o ...
- HDU更多的学校比赛9场 HDU 4965Fast Matrix Calculation【矩阵运算+数学技巧】
困难,.,真,,,不是太困难 的问题是,有一个矩阵运算优化 您有权发言权N*K矩阵A给K*N矩阵B(1<=N<=1000 && 1=<K<=6).他们拿起了第一 ...
- 51nod 1170 1770 数数字(数学技巧)
解题思路:看到题后,直接想到分成两种情况: ①:a*b >9 这里又分成两种 1. n==1 a*b 直接是一个两位数 求得十位和个位(这里十位和个位不可能相等) 然后如果等于d 则结果=1 2 ...
- LeetCode 319 ——Bulb Switcher——————【数学技巧】
319. Bulb Switcher My Submissions QuestionEditorial Solution Total Accepted: 15915 Total Submissions ...
- CF 305B——Continued Fractions——————【数学技巧】
B. Continued Fractions time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- hdu-2256 Problem of Precision---矩阵快速幂+数学技巧
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2256 题目大意: 题目要求的是(sqrt(2)+sqrt(3))^2n %1024向下取整的值 解题 ...
- nyoj--84--阶乘的0(数学技巧)
阶乘的0 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 计算n!的十进制表示最后有多少个0 输入 第一行输入一个整数N表示测试数据的组数(1<=N<=100 ...
随机推荐
- IOS 版本控制判断
// 版本判断#define SYSTEM_VERSION(ver) [[[UIDevice currentDevice] systemVersion] compare:ver] != NSOrder ...
- 6.Python初窥门径(小数据池,集合,深浅拷贝)
Python(小数据池,集合,深浅拷贝) 一.小数据池 什么是小数据池 小数据池就是python中一种提高效率的方式,固定数据类型,使用同一个内存地址 小数据池 is和==的区别 == 判断等号俩边的 ...
- redis之进阶
redis之进阶 redis redis介绍 redis的功能特性 1,高速读写 2,数据类型丰富 3,支持持久化 4,多种内存分配及回收策略 5,支持事务 6,消息队列.redis用的多的还是发 ...
- c#字符串字面量
分为两种: 1 常规字符串字面量 2逐字字面量字符串:以@字符为前缀.注意:注意逐字字面量唯一例外的是相邻的双引号组,它们被解释为单个双引号字符.
- 关于企业邮箱无法提醒解决办法(未安装邮件客户端可添加至网易邮箱大师/qq邮箱等)
关于企业邮箱无法提醒解决办法: 一.使用现有的邮箱客户端,以下以网易的邮箱大师为例mail.exe 点击客户端左边的添加邮箱账号,在出现的对话框中输入账号和密码后,点击登陆按钮后,等待添加完成即可,邮 ...
- Jmeter4.0----响应断言(6)
1.说明 一个HTTP请求发出去,怎么判断执行的任务是否成功呢?通过检查服务器响应数据,是否返回预期想要的数据,如果是,判断任务成功,反之任务失败. 作用:判断请求是否成功 2.步骤 第一步:添加 “ ...
- Java 数字数组随机数工具类 NumberUtils、ArrayUtils、RandomUtils用法
commons-lang3-3-3.8.1 //----------------------------------------------------------------------- /** ...
- RHEL/CentOS 7.X 安装笔记
配置vim # 配置 vim 编辑器 yum install vim rm /usr/bin/vi ln -s /usr/bin/vim /usr/bin/vi vi /etc/vimrc # 开启语 ...
- css经典布局之双飞翼
经典的两个布局方式有圣杯布局和双飞翼布局,圣杯布局主要用在国外,双飞翼布局是淘宝的UED团队开发的,优化了圣杯布局. 主要解决页面分不同列显示的问题, 一般只做页面的时候,我们分三部分,左边, ...
- Generator 和 函数异步应用 笔记
Generator > ES6 提供的一种异步编程解决方案 > Generator 函数是一个状态机,封装了多个内部状态.还是一个遍历器对象生成函数.返回<label>遍历器对 ...