【无码专区6】球与盒子(数学线性筛)
因为只有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】球与盒子(数学线性筛)相关推荐
- 【无码专区2】序列划分(数学)
有std,但是没有自我实现,所以是无码专区 description 完全由数字组成的字符串 sss,划分成若干段,每一段看成一个十进制的数(允许前导零)求有多少种划分方法使得相邻两个数至少一个是 DD ...
- 【无码专区13】最小公倍数(线段树)
因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 my idea顾名思义,记录了我的整个思维过程,以及自己部分实现细节口胡,还有期望分数 solution才是dls正解,但是因为只 ...
- 【无码专区12】子集和(背包dp)
此题已自我实现,但仍归于无码专区 本题在考场上就过了,所以难度并不高,发现性质即可. problem 有 nnn 个正整数 a1,a2,...,ana_1,a_2,...,a_na1,a2,... ...
- 【无码专区11】异或2(结论 / 推式子 + 哈希hash + 大整数高精度 加减乘除重载考察)
本题已自我实现.但仍归于无码专区 problem 求 ∑i=1n−1i⨁(n−i)\sum_{i=1}^{n-1}i\bigoplus (n-i)∑i=1n−1i⨁(n−i). 20%,n≤1e6; ...
- 【无码专区10】第K大查询(双向链表 /主席树+st表)
已自我实现,但还是归入无码专区序列.哈哈哈哈哈 对于my idea部分,我的每一个想法都实现了,可供参考. problem 给定一个 1∼n1\sim n1∼n 的排列和 kkk,求所有 r−l+1≥ ...
- 【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)
因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...
- 【无码专区8】三角形二维数点——计数有多少个给定点落在三角形区域内
因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...
- 【无码专区7】括号序列(思维)
因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...
- 【无码专区5】01串(大讨论+构造)
因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...
最新文章
- Nginx 静态文件 location 指定
- get,post请求的编码统一
- 小森林顺序_这篇微推价值过亿!仁恒公园世纪二期选房顺序“摇号”,1:7!
- win32 串口阻塞的方式发送接收数据
- ansys里面自带chemkin_Chemkin-Pro: Chemistry Effects Predicting Simulation Software | Ansys
- Spring的XML解析原理,java软件开发面试常见问题
- Linux 添加中文字体库
- C语言状态机模块实现
- 基于Scala开发的spark临界点均值法填充缺失值的job
- 2021.10.9小米一面
- 邻居表项的app_solicit数量
- MVC详解:mvc是什么?为什么要用MVC?MVC工作原理以及MVC优缺点
- windows下合并多个txt,文件
- C#,蛇梯问题(Snake and Ladder Problem)的算法与源代码
- 使用python+selenium对12306车票数据读取
- python函数助手_转jmeter(十五)函数助手
- 机器学习中常说的CV是什么?
- mysql 单据编号生成_mysql自动生成单据编号
- 后台任务和PHP-Resque的使用
- ppt转换成html5格式的视频格式,如何将PPT文件转换成视频文件?
热门文章
- 新一代来袭︱不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?...
- 按照演算,整个宇宙将会陷入无边的黑暗
- linux 系统迁移到固态硬盘,把Debian GNU/Linux迁移到SSD上
- 频谱分析幅值单位_案例分享丨某水泥厂入窑斗提减速机不对中故障分析及处理...
- 蓝桥杯java龟兔赛跑_算法-蓝桥杯习题(一)
- iphone最新款手机_苹果罕见“跌停”!遭遇6年来最惨淡一夜,2019年全球股市第一颗雷引爆...
- eomj表情 mysql_mysql存储4字节的表情包数据报异常_Emoji表情包_Incorrect string value: #3...
- android 强制下线功能,Android学习之基础知识八—Android广播机制实践(实现强制下线功能)...
- scrcpy投屏_安卓投屏利器——PC一键控制多台手机
- java不适合开发cv吗_JavaCV开发环境的配置