没考虑重复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. 五分钟搞定 Linux 文档全部知识,就看这篇文章

    作者:无痴迷,不成功 来源:见文末 写在前面 我们都知道Linux是一个支持多用户.多任务的系统,这也是它最优秀的特性,即可能同时有很多人都在系统上进行工作,所以千万不要强制关机,同时,为了保护每个人 ...

  2. CF1141F Same Sum Blocks(easy/hard)

    传送门easy 传送门hard 切水题的感觉真好 看到数据范围这么小,所以暴力枚举所有的可能,然后用map+vector存下每种值的区间,然后贪心去选 代码: #include<cstdio&g ...

  3. Vue --6 router进阶、单页面应用(SPA)带来的问题

    一.Vue-router进阶 回顾学过的vue-router,并参考官方文档学习嵌套路由等路由相关知识. 二.单页面应用(SPA)带来的问题 1.虽然单页面应用有优点,但是,如果后端不做服务器渲染(h ...

  4. WebApi迁移ASP.NET Core2.0

    WebApi迁移ASP.NET Core2.0 一步一步带你做WebApi迁移ASP.NET Core2.0   随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的AS ...

  5. Hypertext Application Language(HAL)

    Hypertext Application Language(HAL) HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单.统一的形式, ...

  6. C. Epidemic in Monstropolis

    http://codeforces.com/contest/733/problem/C 一道很恶心的模拟题. 注意到如果能凑成b[1],那么a的前缀和一定是有一个满足是b[1]的,因为,如果跳过了一些 ...

  7. 51NOD 区间的价值 V2

    http://www.51nod.com/contest/problem.html#!problemId=1674 因为题目要求的只是& 和 | 这两个运算.而这两个运算产生的值是有限的. & ...

  8. TDH-search汇报理解

    题目:海量数据查询开头:1.自我介绍:2.题目切入: 什么是海量数据查询?(海量数据,快速,符合要求) 几个常用场景(搜索引擎,百度:话单查询:影像平台,高铁)3.展示目录:架构,案例,平台规划 4. ...

  9. 《java学习二》并发编程

    多线程创建方式 1.继承thread类,重写run方法 CreateThread createThread = new CreateThread();     ------createThread  ...

  10. 专题《一》mysql优化 ---------主从复制,读写

    主从复制是mysql自带的功能,读写分离用第三方插件 主从复制作用:读写分离(mycat),数据备份,高可用,集群 原理:二进制sql执行文件-----insert,update,delete,cre ...