因为只有std,没有自我实现,所以是无码专区

主要是为了训练思维能力

solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dls的实现不太一样。

std可能也会带有博主自己的注释。

problem

把 nnn 个球放入 nnn 个盒子里面,每个盒子里恰好都有一个球,标号从 111 开始。

且盒子标号和里面装的球的标号的因子个数必须相同。

答案对 500009500009500009 取模。多组数据。

T≤1e5,n≤1e9T\le 1e5,n\le 1e9T≤1e5,n≤1e9。


我的想法

observation :因子数不同的之间互相独立,因子数相同的之间方案数为阶乘,所以实际上是不同因子数的方案数的乘积。

对于 70%70\%70% 的 n≤1e6n\le 1e6n≤1e6 数据,可以线性筛预处理将所有数按照因子个数分类,然后计算即可。

多组数据肯定不能每次都 O(n)O(n)O(n) 的扫一遍。

将查询的 nin_ini​ 按升序排列,指针扫的时候将 iii 加入,就单独处理 iii 因子个数那个集合的贡献,很好维护。

observation:111 只能放在 111 里。

observation:质数之间可以互相放。

由整数的唯一标准分解,所有数都可以被若干个质数的幂表示。


solution

观察到,模数是非常小的,不同于往常的大质数。

所以当 cntx≥modcnt_x\ge modcntx​≥mod 之后,答案一定为 000。

cntx:cnt_x:cntx​: 因子数为 xxx 的个数。

最后答案为 ∏cntx!\prod cnt_x!∏cntx​! 。

通过打表发现,当 n≥2250000n\ge 2250000n≥2250000,就已经存在一个 cntx≥modcnt_x\ge modcntx​≥mod 了。

所以只需要在 n<2250000n<2250000n<2250000 时用线性筛求出每个数的因子数,乘上对应的 cntxcnt_xcntx​,当 n≥2250000n\ge 2250000n≥2250000 直接输出 000 即可。

一般而言,当模数不是寻常的模数时,正解往往会隐藏在模数的性质背后。

当模数是常见的大质数,一般都是数学计算方案了。


std

#include <algorithm>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <iostream>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
#include <cassert>
#include <ctime>
#include <queue>
using namespace std;
#define VAR(a,b) __typeof(b) a=(b)
#define REP(i,n) for(int _n=n, i=0;i<_n;++i)
#define FOR(i,a,b) for(int i=(a),_b=(b);i<=_b;++i)
#define FORD(i,a,b) for(int i=(a),_b=(b);i>=_b;--i)
#define FOREACH(it,c) for(VAR(it,(c).begin());it!=(c).end();++it)
#define ALL(c) (c).begin(),(c).end()
#define TRACE(x) cerr << "TRACE(" #x ")" << endl;
#define DEBUG(x) cerr << #x << " = " << x << endl;typedef long long LL;
typedef unsigned long long ULL;
const int INF = 1000000000;
const LL INFLL = LL(INF) * LL(INF);
template<class T> inline int size(const T &c) {return c.size();
}
int rint() {int x;if (scanf("%d", &x) != 1)return -1;return x;
}
LL rLL() {LL x;if (scanf("%lld", &x) != 1)return -1;return x;
}const int MOD = 500009;
const int MAXN = 2250000;int main() {freopen("ball.in", "r", stdin);freopen("ball.out", "w", stdout);vector<int> ndivisors(MAXN + 1, 1);int p = 2;for (p = 2; p * p * p <= MAXN; ++p)if (ndivisors[p] == 1) {int pk = p;for (int k = 1;; ++k) {int mm = 0;for (int q = pk; q <= MAXN; q += pk) {++mm;if (mm == p)mm = 0;elsendivisors[q] *= k + 1;}LL pk2 = LL(pk) * p;if (pk2 > MAXN)break;pk = int(pk2);}}for (; p * p <= MAXN; ++p)if (ndivisors[p] == 1) {int pk = p;for (int k = 1; k <= 2; ++k) {int mm = 0;for (int q = pk; q <= MAXN; q += pk) {++mm;if (mm == p)mm = 0;elsendivisors[q] *= k + 1;}pk *= p;}}for (; p <= MAXN; ++p)if (ndivisors[p] == 1) {for (int q = p; q <= MAXN; q += p) {ndivisors[q] *= 2;}}vector<unsigned> cnt(MAXN + 1, 0);vector<unsigned> res(MAXN + 1, 0);res[0] = 1;for (int n = 1; n <= MAXN; ++n) {int d = ndivisors[n];++cnt[d];res[n] = res[n - 1] * (cnt[d] % 1024u) % unsigned(MOD);if (cnt[d] >= 1024u) {unsigned a = res[n - 1] * (cnt[d] >> 10) % unsigned(MOD);res[n] = (res[n] + (a << 10)) % unsigned(MOD);}if (res[n] == 0)break;}int ntc = rint();REP(tc, ntc) {int n = rint();int r = n <= MAXN ? res[n] : 0;printf("%d\n", r);}
}

【无码专区6】球与盒子(数学线性筛)相关推荐

  1. 【无码专区2】序列划分(数学)

    有std,但是没有自我实现,所以是无码专区 description 完全由数字组成的字符串 sss,划分成若干段,每一段看成一个十进制的数(允许前导零)求有多少种划分方法使得相邻两个数至少一个是 DD ...

  2. 【无码专区13】最小公倍数(线段树)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 my idea顾名思义,记录了我的整个思维过程,以及自己部分实现细节口胡,还有期望分数 solution才是dls正解,但是因为只 ...

  3. 【无码专区12】子集和(背包dp)

    此题已自我实现,但仍归于无码专区 本题在考场上就过了,所以难度并不高,发现性质即可. problem 有 nnn 个正整数 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,... ...

  4. 【无码专区11】异或2(结论 / 推式子 + 哈希hash + 大整数高精度 加减乘除重载考察)

    本题已自我实现.但仍归于无码专区 problem 求 ∑i=1n−1i⨁(n−i)\sum_{i=1}^{n-1}i\bigoplus (n-i)∑i=1n−1​i⨁(n−i). 20%,n≤1e6; ...

  5. 【无码专区10】第K大查询(双向链表 /主席树+st表)

    已自我实现,但还是归入无码专区序列.哈哈哈哈哈 对于my idea部分,我的每一个想法都实现了,可供参考. problem 给定一个 1∼n1\sim n1∼n 的排列和 kkk,求所有 r−l+1≥ ...

  6. 【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  7. 【无码专区8】三角形二维数点——计数有多少个给定点落在三角形区域内

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  8. 【无码专区7】括号序列(思维)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  9. 【无码专区5】01串(大讨论+构造)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

最新文章

  1. Nginx 静态文件 location 指定
  2. get,post请求的编码统一
  3. 小森林顺序_这篇微推价值过亿!仁恒公园世纪二期选房顺序“摇号”,1:7!
  4. win32 串口阻塞的方式发送接收数据
  5. ansys里面自带chemkin_Chemkin-Pro: Chemistry Effects Predicting Simulation Software | Ansys
  6. Spring的XML解析原理,java软件开发面试常见问题
  7. Linux 添加中文字体库
  8. C语言状态机模块实现
  9. 基于Scala开发的spark临界点均值法填充缺失值的job
  10. 2021.10.9小米一面
  11. 邻居表项的app_solicit数量
  12. MVC详解:mvc是什么?为什么要用MVC?MVC工作原理以及MVC优缺点
  13. windows下合并多个txt,文件
  14. C#,蛇梯问题(Snake and Ladder Problem)的算法与源代码
  15. 使用python+selenium对12306车票数据读取
  16. python函数助手_转jmeter(十五)函数助手
  17. 机器学习中常说的CV是什么?
  18. mysql 单据编号生成_mysql自动生成单据编号
  19. 后台任务和PHP-Resque的使用
  20. ppt转换成html5格式的视频格式,如何将PPT文件转换成视频文件?

热门文章

  1. 新一代来袭︱不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?...
  2. 按照演算,整个宇宙将会陷入无边的黑暗
  3. linux 系统迁移到固态硬盘,把Debian GNU/Linux迁移到SSD上
  4. 频谱分析幅值单位_案例分享丨某水泥厂入窑斗提减速机不对中故障分析及处理...
  5. 蓝桥杯java龟兔赛跑_算法-蓝桥杯习题(一)
  6. iphone最新款手机_苹果罕见“跌停”!遭遇6年来最惨淡一夜,2019年全球股市第一颗雷引爆...
  7. eomj表情 mysql_mysql存储4字节的表情包数据报异常_Emoji表情包_Incorrect string value: #3...
  8. android 强制下线功能,Android学习之基础知识八—Android广播机制实践(实现强制下线功能)...
  9. scrcpy投屏_安卓投屏利器——PC一键控制多台手机
  10. java不适合开发cv吗_JavaCV开发环境的配置