没考虑重复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的更多相关文章

  1. 丑数<数学技巧>

    题意:丑数就是质因子只有2,3,5 ,7,的数,另外1也是丑数.求第n(1=<n<=5842)个丑数,n=0,结束. 思路:.3.5或者7的结果(1除外).那么,现在最主要的问题是如何排序 ...

  2. nyoj--1170--最大的数(数学技巧)

    最大的数 时间限制:1000 ms  |           内存限制:65535 KB 难度:3 描述 小明和小红在打赌说自己数学学的好,于是小花就给他们出题了,考考他们谁NB,题目是这样的给你N个 ...

  3. hdu 5675 ztr loves math(数学技巧)

    Problem Description ztr loves research Math.One day,He thought about the "Lower Edition" o ...

  4. HDU更多的学校比赛9场 HDU 4965Fast Matrix Calculation【矩阵运算+数学技巧】

    困难,.,真,,,不是太困难 的问题是,有一个矩阵运算优化 您有权发言权N*K矩阵A给K*N矩阵B(1<=N<=1000 && 1=<K<=6).他们拿起了第一 ...

  5. 51nod 1170 1770 数数字(数学技巧)

    解题思路:看到题后,直接想到分成两种情况: ①:a*b >9 这里又分成两种 1. n==1 a*b 直接是一个两位数 求得十位和个位(这里十位和个位不可能相等) 然后如果等于d 则结果=1 2 ...

  6. LeetCode 319 ——Bulb Switcher——————【数学技巧】

    319. Bulb Switcher My Submissions QuestionEditorial Solution Total Accepted: 15915 Total Submissions ...

  7. CF 305B——Continued Fractions——————【数学技巧】

    B. Continued Fractions time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  8. hdu-2256 Problem of Precision---矩阵快速幂+数学技巧

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2256 题目大意: 题目要求的是(sqrt(2)+sqrt(3))^2n %1024向下取整的值 解题 ...

  9. nyoj--84--阶乘的0(数学技巧)

    阶乘的0 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 计算n!的十进制表示最后有多少个0 输入 第一行输入一个整数N表示测试数据的组数(1<=N<=100 ...

随机推荐

  1. IOS 版本控制判断

    // 版本判断#define SYSTEM_VERSION(ver) [[[UIDevice currentDevice] systemVersion] compare:ver] != NSOrder ...

  2. 6.Python初窥门径(小数据池,集合,深浅拷贝)

    Python(小数据池,集合,深浅拷贝) 一.小数据池 什么是小数据池 小数据池就是python中一种提高效率的方式,固定数据类型,使用同一个内存地址 小数据池 is和==的区别 == 判断等号俩边的 ...

  3. redis之进阶

    redis之进阶   redis redis介绍 redis的功能特性 1,高速读写 2,数据类型丰富 3,支持持久化 4,多种内存分配及回收策略 5,支持事务 6,消息队列.redis用的多的还是发 ...

  4. c#字符串字面量

    分为两种: 1 常规字符串字面量 2逐字字面量字符串:以@字符为前缀.注意:注意逐字字面量唯一例外的是相邻的双引号组,它们被解释为单个双引号字符.

  5. 关于企业邮箱无法提醒解决办法(未安装邮件客户端可添加至网易邮箱大师/qq邮箱等)

    关于企业邮箱无法提醒解决办法: 一.使用现有的邮箱客户端,以下以网易的邮箱大师为例mail.exe 点击客户端左边的添加邮箱账号,在出现的对话框中输入账号和密码后,点击登陆按钮后,等待添加完成即可,邮 ...

  6. Jmeter4.0----响应断言(6)

    1.说明 一个HTTP请求发出去,怎么判断执行的任务是否成功呢?通过检查服务器响应数据,是否返回预期想要的数据,如果是,判断任务成功,反之任务失败. 作用:判断请求是否成功 2.步骤 第一步:添加 “ ...

  7. Java 数字数组随机数工具类 NumberUtils、ArrayUtils、RandomUtils用法

    commons-lang3-3-3.8.1 //----------------------------------------------------------------------- /** ...

  8. RHEL/CentOS 7.X 安装笔记

    配置vim # 配置 vim 编辑器 yum install vim rm /usr/bin/vi ln -s /usr/bin/vim /usr/bin/vi vi /etc/vimrc # 开启语 ...

  9. css经典布局之双飞翼

    经典的两个布局方式有圣杯布局和双飞翼布局,圣杯布局主要用在国外,双飞翼布局是淘宝的UED团队开发的,优化了圣杯布局.   主要解决页面分不同列显示的问题,   一般只做页面的时候,我们分三部分,左边, ...

  10. Generator 和 函数异步应用 笔记

    Generator > ES6 提供的一种异步编程解决方案 > Generator 函数是一个状态机,封装了多个内部状态.还是一个遍历器对象生成函数.返回<label>遍历器对 ...