\(\text{Solution}\)

发现题目就是求 \(\sum[\prod_{i=1}^k x_i \le n]\)

\(k \le 10^9\) 太可怕了

然而发现如果限定 \(x_i > 1\) 那么 \(i \le \log n\)

于是我们可以愉快地统计了

设 \(f_i(n)\) 表示将 \(n\) 分成 \(i\) 份使 \(x_i > 1\) 的方案数

那么 \(f_i(n)=\sum_{d|n}f_{i-1}(\frac n d)-f_{i-1}(n)\)

那个减号就是减去 \(d=1\) 时的情况

先不考虑减法,发现它的转移就是 \(Dirichlet\) 前缀和

于是处理 \(f\) 可做到 \(O(n \log n \log\log n)\)

每个询问还要枚举多少个位置不填 \(1\),组合算一下方案

总的就是 \(O(n \log n \log\log n + Q \log n)\)

\(\text{Code}\)

#include <cstdio>
#include <iostream>
#define re register
#define LL long long
using namespace std; const int N = 5e5 + 5, P = 998244353;
int mxR, mxK, q, log[N], tot, pr[N], vis[N];
LL f[20][N], inv[20]; inline void read(int &x)
{
x = 0; int f = 1; char ch = getchar();
while (!isdigit(ch)) f = (ch == '-' ? -1 : f), ch = getchar();
while (isdigit(ch)) x = (x<<3) + (x<<1) + (ch^48), ch = getchar();
x *= f;
}
void sieve(int n)
{
for(re int i = 2; i <= n; i++)
{
if (!vis[i]) pr[++tot] = i;
for(re int j = 1; j <= tot && pr[j] * i <= n; j++)
{
vis[pr[j] * i] = 1;
if (i % pr[j] == 0) break;
}
}
}
LL Add(LL x, LL y)
{
x += y;
if (x > P) x -= P;
return x;
} int main()
{
freopen("easy.in", "r", stdin), freopen("easy.out", "w", stdout);
read(mxR), read(mxK), read(q);
sieve(mxR);
for(re int i = 2; i <= mxR; i++) log[i] = log[i >> 1] + 1, f[1][i] = 1;
int lg = log[mxR];
for(re int i = 2; i <= lg; i++)
{
for(re int j = 1; j <= mxR; j++) f[i][j] = f[i - 1][j];
for(re int j = 1; j <= tot; j++)
for(re int k = 1; k * pr[j] <= mxR; k++)
f[i][k * pr[j]] = Add(f[i][k * pr[j]], f[i][k]);
for(re int j = 1; j <= mxR; j++) f[i][j] = Add(f[i][j], P - f[i - 1][j]);
}
for(re int i = 1; i <= lg; i++)
for(re int j = 1; j <= mxR; j++) f[i][j] = Add(f[i][j], f[i][j - 1]);
inv[1] = 1;
for(re int i = 2; i <= lg; i++) inv[i] = (P - P / i) * inv[P % i] % P;
for(int l, r, k; q; q--)
{
read(l), read(r), read(k);
LL ans = 0, c = 1;
for(re int i = 1; i <= log[r]; i++)
{
c = c * (k - i + 1) % P * inv[i] % P;
ans = Add(ans, (f[i][r] - f[i][l - 1] + P) * c % P);
}
printf("%lld\n", ans + (l <= 1));
}
}

NOIP 模拟赛 简单题的更多相关文章

  1. noip模拟赛 水题

    题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每张牌长和宽分别是xi和yi.对于第二副牌的每张牌长和宽分别是aj和bj.第一副牌的第i张牌能覆盖第二副牌的第 ...

  2. 2016 10 26考试 NOIP模拟赛 杂题

    Time 7:50 AM -> 11:15 AM 感觉今天考完后,我的内心是崩溃的 试题 考试包 T1: 首先看起来是个贪心,然而,然而,看到那个100%数据为n <= 2000整个人就虚 ...

  3. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  4. 2016-06-19 NOIP模拟赛

          2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...

  5. 【HHHOJ】NOIP模拟赛 玖 解题报告

    点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...

  6. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  7. NOIP模拟赛 6.29

    2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走, ...

  8. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  9. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  10. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

随机推荐

  1. Linux 系统环境监测

    Linux系统环境监测 Linux系统环境主要监测CPU.内存.磁盘I/O和网络流量. 1. CPU (1) 查看CPU的负载情况:uptime 可以通过uptime查看系统整体的负载情况. 如果服务 ...

  2. [论文阅读] 颜色迁移-Linear Monge-Kantorovitch(MKL)

    [论文阅读] 颜色迁移-Linear Monge-Kantorovitch(MKL) 文章: The Linear Monge-Kantorovitch Linear Colour Mapping f ...

  3. 【每日一题】【找到位置返回&升序数组中第K大就是n-K小】2022年1月17日-NC88 寻找第K大

    描述有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数. 给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在. 方法 ...

  4. Pycharm介绍下载指南

    Pycharm的基本介绍 PyCharm是一种Python IDE是可以帮助用户在使用Python语言开发时提高其效率的开发工具. Pycharm的官网:https://www.jetbrains.c ...

  5. [数据结构][洛谷]P3375模板题 KMP

    主要还是KMP算法,上学期没学,只是考前抱了抱佛脚,也没怎么弄明白. 先放代码: //KMP #include <bits/stdc++.h>//万能头 using namespace s ...

  6. 一篇文章教你实战Docker容器数据卷

    在上一篇中,咱们对Docker中的容器数据卷做了介绍.已经知道了容器数据卷是什么?能干什么用.那么本篇咱们就来实战容器数据卷,Docker容器数据卷案例主要做以下三个案例 1:宿主机(也就是Docke ...

  7. Qt对象跨线程出现的问题记录,以及解决方案

    Qt在跨线程开发的时候可能会出现不少问题,在这里记录一下 Qt目前用下来还是非常强大的,虽然只是用在桌面端程序开发上,但是其强大的桌面开发库真的挺好用的(Layout除外,你妈死了). Qt除了UI, ...

  8. 【基础篇】一文带你掌握 Redis

    一.摘要 谈起 Redis,相信大家都不会陌生,做过云平台开发的程序员多多少少会接触到它,Redis 英文全称:Remote Dictionary Server,也被称之为远程字典服务. 从官方的定义 ...

  9. Android的诞生

    Android操作系统最初由Andy Rubin开发,刚开始主要支持手机,被Google收购后,对Android进行了改良,使其可以用于平板电脑等其它领域. 1.1.1 Android的发展史Andr ...

  10. [OpenCV实战]31 使用OpenCV将一个三角形仿射变换到另一个三角形

    目录 1 什么是仿射变换? 2 使用OpenCV进行三角形仿射变换 2.1 定义输入和输出 2.2 计算边界框 2.3 裁剪图像和更改坐标 2.4 计算仿射变换矩形 2.5 应用仿射变换到三角形 2. ...