没考虑重复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. crm项目整理概要

    一.开发背景 由于公司人员的增多,原来通过excel表格存取方式过于繁琐,而且对于公司人员的调配和绩效考核等不能做到精确处理,所以开发crm系统,开始开发只是针对销售人员和客户,后面陆续加上一些操作, ...

  2. SQL Server权限设置

    常用的几个系统表:(其实是View) sysdatabases,主数据库,服务器上的数据库 sysobjects,每个数据库,所有数据库对象 syscolumns,每个数据库,列 sysprocess ...

  3. C# 流

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. Linux —— awk命令

    - 作用: 强大的文本分析工具,对于文本分析来说绝对是一把利器 - 语法: awk '{pattern + action}' {filenames} pattern需要查找的内容 action 查找到 ...

  5. CodeForces - 1003-B-Binary String Constructing (规律+模拟)

    You are given three integers aa, bb and xx. Your task is to construct a binary string ssof length n= ...

  6. 我所接触到的JWT

    名称:JWT--->Json Web Token 用途:客户端请求服务端API时的认证方式之一 用法: 优点: 体积小(一串字符串),因而传输速度快 支持跨域验证,多应用于单点登录 传输方式多样 ...

  7. Jmeter4.0----录制脚本(4)

    1.前言 Jmeter录制脚本有两种方式.1.通过第三方工具录制比如:Badboy,然后转化为jmeter可用的脚本:2.使用jmeter本身自带的录制脚本功能. 对于测试小白来说可用先使用jmete ...

  8. 爬虫(BeautifulSoup4)——安装

    环境:python3 win10 安装这个心好累啊!网上找了很多办法都安装不成功,后来换了几个安装包,最后4.4.1版本的包终于能用了! https://blog.csdn.net/www520507 ...

  9. 使用docker save load 的时候的一个小问题

    当你使用docker save image_id > aa.tar ; 然后再使用 docker load < aa.tar 时, 你会发现此时导入的镜像的repository和 tag ...

  10. ML.NET 示例:目录

    ML.NET 示例中文版:https://github.com/feiyun0112/machinelearning-samples.zh-cn 英文原版请访问:https://github.com/ ...