Codeforces Round 940 E. Carousel of Combinations 【威尔逊定理】

E

题意

给定一个正整数 n n n,定义 C ( i , j ) C(i, j) C(i,j) 为:从 ( 1 , 2 , 3 , . . . , i ) (1,2,3,...,i) (1,2,3,...,i) 中选出 j j j不同的数,构成一个圆排列的不同的方案数

求出: ∑ i = 1 n ∑ j = 1 i ( C ( i , j ) m o d j ) \sum_{i=1}^{n} \sum_{j = 1}^{i} (C(i,j) mod \hspace{3pt} j) i=1nj=1i(C(i,j)modj)

思路

首先 C ( i , j ) = A i j j C(i,j) = \dfrac{A_{i}^{j}}{j} C(i,j)=jAij,因为普通的排列其实就可以看成是从原排列中的 j j j 个数,选择一个作为 开头 元素,即 A i j = C ( i , j ) × j A_{i}^{j} = C(i,j) \times j Aij=C(i,j)×j

因此 C ( i , j ) C(i,j) C(i,j) mod j = i ( i − 1 ) . . . ( i − j + 1 ) j j = \dfrac{i(i - 1)...(i - j + 1)}{j} j=ji(i1)...(ij+1) mod j j j,注意到分子是连续 j j j 个数,因此分子的 j j j 个数中,一定至少有一个数是 j j j 的倍数,这个数就是 j × ⌊ i j ⌋ j \times \lfloor \dfrac{i}{j} \rfloor j×ji,那么我们不妨用这个数去和分母作除法,剩下的其他数字模 j j j 就是 [ 1 , j − 1 ] [1,j-1] [1,j1] 都会出现,那么现在就变成:
C ( i , j ) C(i,j) C(i,j) mod j = ( ( j − 1 ) ! × ⌊ i j ⌋ ) j = \left( (j-1)! \times \lfloor \dfrac{i}{j} \rfloor \right) j=((j1)!×ji) mod j j j

至此,就出现了经典的威尔逊定理的格式:

p p p质数时, ( p − 1 ) ! (p - 1)! (p1)! mod p = p − 1 p = p - 1 p=p1

同时,当 p p p大于 4 4 4合数时, ( p − 1 ) ! (p - 1)! (p1)! mod p = 0 p = 0 p=0,因为前 p − 1 p-1 p1 个数乘积一定会出现 p p p 的倍数

因此当 j > 4 j > 4 j>4 且为合数时, C ( i , j ) = 0 C(i,j) = 0 C(i,j)=0
p p p质数时, C ( i , j ) = − ⌊ i j ⌋ C(i,j) = -\lfloor \dfrac{i}{j} \rfloor C(i,j)=ji mod j j j
p = 4 p = 4 p=4 时,由于 ( 4 − 1 ) ! = 6 (4-1)! = 6 (41)!=6 mod 4 = 2 4 = 2 4=2,最后和 ⌊ i 4 ⌋ \lfloor \dfrac{i}{4} \rfloor 4i 乘起来对 4 4 4 求模,是以 0 0 0 2 2 2 为值,周期为 4 4 4 交替,其实也是类似质数

不妨把 j j j 交换到循环外层
对于当前质数 p p p,它对答案的贡献是 ∑ i = j n − ⌊ i j ⌋ \sum_{i = j}^{n} -\lfloor \dfrac{i}{j} \rfloor i=jnji mod j j j,不难发现,这个值是以 j j j 为周期变化的,因为是下取整且取模,那么就可以将 [ i , n ] [i,n] [i,n] 分成长度为 j j j 的若干段,分段计算,一共 O ( n j ) O(\dfrac{n}{j}) O(jn)

那么对于所有质数,总复杂度为: O ( n log ⁡ n ) O(n \log n) O(nlogn) (调和级数复杂度)

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n' 
#define ull unsigned long long

const int INF=0x3f3f3f3f;
const long long INFLL=0x3f3f3f3f3f3f3f3fLL;

typedef long long ll;

const int N = 1000001;
const ll mod = 1e9 + 7;

std::vector<int> primes;
bool vis[N + 5];
ll ans[N + 5];
ll d[N + 5];

void init(){ //欧拉筛
	fore(i, 2, N){
		if(!vis[i])	primes.push_back(i);
		for(auto p : primes){
			if(p * i >= N)	break;
			vis[p * i] = true;
			if(i % p == 0)	break;
		}
	}
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    init();
    /* 处理质数 */
    for(auto p : primes){
    	for(int l = p; l < N; l += p){
    		int r = std::min(l + p - 1, N - 1);
    		ll w = -l / p;
    		w %= p;
    		if(w < 0) w += p;
    		d[l] = (d[l] + w) % mod;
    		d[r + 1] = (d[r + 1] - w + mod) % mod;
    	}
    }
    
    /* 单独处理 j = 4 的情况 */
    int p = 4;
    for(int l = p; l < N; l += p){
    	int r = std::min(l + p - 1, N - 1);
		ll w = l / p;
		w *= -2;
		w %= p;
		if(w < 0) w += p;
		d[l] = (d[l] + w) % mod;
		d[r + 1] = (d[r + 1] - w + mod) % mod;
    }
    
    fore(i, 1, N){
    	d[i] = (d[i - 1] + d[i]) % mod;
    	ans[i] = (ans[i - 1] + d[i]) % mod;
    }
    
    int t;
    std::cin >> t;
    while(t--){
    	int n;
    	std::cin >> n;
    	std::cout << ans[n] << endl;
    }
	return 0; 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/570624.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32的GPIO控制寄存器开发

寄存器GPIO控制 寄存器地址 寄存器地址计算 某个寄存器地址&#xff0c;由三个参数决定&#xff1a;1、总线基地址&#xff08;BUS_BASE_ADDR&#xff09;&#xff1b;2&#xff0c;外设基于总线基地址的偏移量&#xff08;PERIPH_OFFSET&#xff09;&#xff1b;3&#xff…

Linux系统CPU持续飙高,如何排查

若一台服务器CPU使用率持续处于一个高峰值&#xff0c;可能导致如&#xff1a;无法ssh链接、操作卡顿、用户访问超时等问题 1.查看CPU使用情况 top命令常用于分析内存指标使用情况 htop命令更直观于top 当CPU达到70%-80%以上时&#xff0c;使用率已过高需要处理 2.找出CPU占…

C++ Qt QMainWindow实现无边框窗口自定义标题栏可拖拽移动拉伸改变窗口大小

本篇博客介绍C Qt QMainWindow实现无边框窗口&#xff0c;适用于win10/win11系统。 QMainWindow相对于QWidget多了dockedwidget功能&#xff0c;跟多人可能更喜欢用QMainWindow做主窗口&#xff0c;如果不需要dockedwidget功能&#xff0c;QMainWindow与QWidget做主窗口基本无…

一款新型的Linux服务器管理工具

最近发现了一款新型的Linux服务器管理工具&#xff0c;名称叫1Panel&#xff0c;本文跟大伙分享一下。 一. 产品介绍 1Panel 是一个开源的 Linux 服务器运维管理面板&#xff0c;具有丰富的功能&#xff0c;可对服务器和容器进行管理。 产品提供简洁直观的We图形界面&#x…

如何使用RRT模式进行交易,昂首资本实例讲解

在上篇文章中&#xff0c;昂首资本用一篇文章讲解了&#xff0c;如何使用RRT模式进行交易以及背后的原理。如果没有看到的各位投资者可以往前翻一下&#xff0c;当然了也有投资者提到了新的问题&#xff0c;那就如何使用&#xff0c;今天昂首资本就用下面有几个例子实例讲解&am…

【C++】---STL之list详解

【C】---STL之list详解 一、了解list的基本信息二、成员函数1、构造2、迭代器3、empty()4、size()5、front()6、back()7、push_front()8、pop_front()9、push_back()10、pop_back()11、insert()12、erase()13、swap()14、sort()15、reverse() 一、了解list的基本信息 1、库里面…

windows查看xxx的版本号

node -v python --version redis-server --version java -version go version mvn -version git --version

【python】随机模拟——赶火车问题、醉汉回家

问题描述 1.赶火车问题。2.模拟二维随机游动&#xff08;醉汉回家&#xff09; 1.赶火车问题。 一列列车从A站开往B站&#xff0c;某人每天赶往B站上车。他已经了解到火车从A站到B站的运行时间是服从均值为30min&#xff0c;标准差为2min的正态随机变量。火车大约下午13&#…

Linux 深入理解Linux文件系统与日志分析

在Linux系统中&#xff0c;文件名和文件数据是分开存储的 文件数据包含 元信息(即不包含文件名的文件属性) 和 实际数据 文件元信息存储在 inode(索引节点)里&#xff0c; 文件实际数据存储在 block(块)里; 文件名存储在目录块里 查看文件的元信息 stat 文件名 [ro…

曲线救国|基于函数计算FC3.0部署AI数字绘画stable-diffusion

曲线救国|基于函数计算FC3.0部署AI数字绘画stable-diffusion 基于函数计算FC2.0部署AI数字绘画stable-diffusion基于函数计算FC3.0部署AI数字绘画stable-diffusion总结 在经过了上一次曲线救国失败经历之后&#xff0c;失败经历参考博文&#xff1a;https://developer.aliyun.c…

C++ —— 继承

什么是继承&#xff1f; 继承是指一种代码可以被复用的机制&#xff0c;在一个类的基础上进行扩展&#xff0c;产生的新类叫做派生类&#xff0c;被继承的类叫基类。&#xff08;也可称为子类和父类&#xff09; 继承的写法&#xff1a; class B : 继承方式 A (…

MCU功耗测量

功耗测量 一、相关概念二、功耗的需求三、测量仪器仪表测量连接SMU功能SMU性能指标 四、功耗测量注意点板子部分存在功耗MCU方面&#xff0c;可能存在干扰项仪器仪表方面 一、相关概念 静态功耗和动态功耗&#xff1a;动态功耗为运行功耗&#xff0c;功耗测量注重每MHz下的功耗…

智能调度|AIRIOT智能车队管理解决方案

客运、货运、汽车租赁、出租运营等行业对车辆管理、车队管理以及司乘人员的管理方式&#xff0c;逐渐向数字化和智能化转型。传统的依赖人工调度、记录和跟踪的管理模式已经难以满足业务发展需要&#xff0c;存在如下痛点&#xff1a; 实时监控与定位功能弱&#xff1a;无法实时…

实验4 数字频率计

实验目的&#xff1a; 1、使用铆孔U7输出一个脉冲&#xff0c;频率不定。 2、使用铆孔V7测量脉冲频率&#xff0c;并在数码管上显示。 实验内容及步骤&#xff1a; 设计原理 测量频率的方法有很多&#xff0c;按照其工作原理分为无源测量法、比较法、示波器法和计数法等。…

restful请求风格的增删改查-----修改and删除

一、修改&#xff08;和添加类似&#xff09; 前端&#xff1a; <script type"text/javascript">function update(){//创建user对象var user {id:$("#id").val(),username:$("#username").val(),password:$("#password").val…

aweraweg

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

​「Python绘图」绘制小猪佩奇

python 绘制小猪佩奇 一、预期结果 二、核心代码 import turtle print("开始绘制小猪佩奇") pen turtle.Turtle() pen.pensize(4) #pen.hideturtle()pen.speed(1000)pen.color("#ff9bc0","pink") pen.setheading(-30) pen.pu() pen.goto(-100,…

34. BI - 美国大学生足球队的 GCN 案例

本文为 「茶桁的 AI 秘籍 - BI 篇 第 34 篇」 文章目录 美国大学生足球队 Embedding&#xff08;GCN&#xff09; Hi&#xff0c;你好。我是茶桁。 在上一节课中&#xff0c;因为需要&#xff0c;我们先是回顾了一下 Graph Embedding&#xff0c;然后跟大家讲解了 GCN 以及其算…

代码随想录——双指针/滑动窗口(二)

一.最长连续递增序列 go语言 func max(a,b int) int{if a>b{return a}return b }func findLengthOfLCIS(nums []int) int {n:len(nums)maxlen:0for l:0;l<n;l{r:l1for r<n&&nums[r]>nums[r-1]{r}maxlenmax(r-l,maxlen)}return maxlen }cpp int findLengt…

为什么大模型训练需要GPU,以及适合训练大模型的GPU介绍

文章目录 前言 1、为什么大模型训练需要GPU&#xff0c;而非CPU 2、现在都有哪些合适的GPU适合训练&#xff0c;价格如何 前言 今天偶然看到一篇关于介绍GPU的推文&#xff0c;我们在复现代码以及模型训练过程中&#xff0c;GPU的使用是必不可少的&#xff0c;那么大模型训练需…