BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)...

数论神题了吧算是

1951: [Sdoi2010]古代猪文
Time Limit: 1 Sec Memory Limit: 64 MB
Submit: 1573 Solved: 650
[Submit][Status][Discuss]

Description
“在那山的那边海的那边有一群小肥猪。他们活泼又聪明,他们调皮又灵敏。他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边海的那边的某片风水宝地曾经存在过一个猪王国。猪王国地理位置偏僻,实施的是适应当时社会的自给自足的庄园经济,很少与外界联系,商贸活动就更少了。因此也很少有其他动物知道这样一个王国。 猪王国虽然不大,但是土地肥沃,屋舍俨然。如果一定要拿什么与之相比的话,那就只能是东晋陶渊明笔下的大家想象中的桃花源了。猪王勤政爱民,猪民安居乐业,邻里和睦相处,国家秩序井然,经济欣欣向荣,社会和谐稳定。和谐的社会带给猪民们对工作火红的热情和对未来的粉色的憧憬。 小猪iPig是猪王国的一个很普通的公民。小猪今年10岁了,在大肥猪学校上小学三年级。和大多数猪一样,他不是很聪明,因此经常遇到很多或者稀奇古怪或者旁人看来轻而易举的事情令他大伤脑筋。小猪后来参加了全猪信息学奥林匹克竞赛(Pig Olympiad in Informatics, POI),取得了不错的名次,最终保送进入了猪王国大学(Pig Kingdom University, PKU)深造。 现在的小猪已经能用计算机解决简单的问题了,比如能用P++语言编写程序计算出A + B的值。这个“成就”已经成为了他津津乐道的话题。当然,不明真相的同学们也开始对他刮目相看啦~ 小猪的故事就将从此展开,伴随大家两天时间,希望大家能够喜欢小猪。 题目描述 猪王国的文明源远流长,博大精深。 iPig在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为N。当然,一种语言如果字数很多,字典也相应会很大。当时的猪王国国王考虑到如果修一本字典,规模有可能远远超过康熙字典,花费的猪力、物力将难以估量。故考虑再三没有进行这一项劳猪伤财之举。当然,猪王国的文字后来随着历史变迁逐渐进行了简化,去掉了一些不常用的字。 iPig打算研究古时某个朝代的猪文文字。根据相关文献记载,那个朝代流传的猪文文字恰好为远古时期的k分之一,其中k是N的一个正约数(可以是1和N)。不过具体是哪k分之一,以及k是多少,由于历史过于久远,已经无从考证了。 iPig觉得只要符合文献,每一种能整除N的k都是有可能的。他打算考虑到所有可能的k。显然当k等于某个定值时,该朝的猪文文字个数为N / k。然而从N个文字中保留下N / k个的情况也是相当多的。iPig预计,如果所有可能的k的所有情况数加起来为P的话,那么他研究古代文字的代价将会是G的P次方。 现在他想知道猪王国研究古代文字的代价是多少。由于iPig觉得这个数字可能是天文数字,所以你只需要告诉他答案除以999911659的余数就可以了。

Input
有且仅有一行:两个数N、G,用一个空格分开。

Output
有且仅有一行:一个数,表示答案除以999911659的余数。

Sample Input
4 2

Sample Output
2048

HINT
10%的数据中,1 <= N <= 50;
20%的数据中,1 <= N <= 1000;
40%的数据中,1 <= N <= 100000;
100%的数据中,1 <= G <= 1000000000,1 <= N <= 1000000000。
Source
Sdoi2010 Contest2

题解:
这里写图片描述
设指数为M,模数为P 则依据费马小定理可以进行转化:
G^M mod P = G^(M mod (P-1) ) ( G != P)
P-1不为质,所以拆成指数,最后用中国剩余定理合并即可

code:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>using namespace std;
int pp[4]={2,3,4679,35617};int G,N,P=999911659;
int jc[4][50000];
int M[4];void exgcd(int a,int b,int &x,int &y)
{if (b==0) {x=1;y=0;return;}exgcd(b,a%b,x,y);int tmp=x;x=y;y=tmp-a/b*y;
}int quick_pow(long long a,int b,int p)
{int ans=1;for(int i=b;i;i>>=1,a=(a*a)%p)if(i&1)ans=(ans*a)%p;return ans;
}void cs()
{jc[1][0]=jc[2][0]=jc[3][0]=jc[0][0]=1;for (int i=0; i<4; i++)for (int j=1; j<=pp[i]; j++)jc[i][j]=(jc[i][j-1]*j)%pp[i];
}
int C(int n,int m,int p)
{if (n<m) return 0;return jc[p][n]*quick_pow(jc[p][m]*jc[p][n-m],pp[p]-2,pp[p])%pp[p];
}
int lucas(int n,int m,int p)
{if (m==0) return 1;return C(n%pp[p],m%pp[p],p)*lucas(n/pp[p],m/pp[p],p)%pp[p];
}int china()
{int a1,b1,a2,b2,a,b,c,x,y;a1=pp[0],b1=M[0];for(int i=1;i<4;i++){a2=pp[i],b2=M[i];a=a1;b=a2;c=b2-b1;exgcd(a,b,x,y);x=((c*x)%b+b)%b;b1=b1+a1*x;a1=a1*b;}return b1;
}int work()
{G%=P;for (int i=1; i*i<=N; i++){if (N%i==0){int tmp=N/i;for (int j=0; j<4; j++){if (tmp!=i)M[j]=(M[j]+lucas(N,i,j))%pp[j];M[j]=(M[j]+lucas(N,tmp,j))%pp[j];}}}printf("%d\n",quick_pow(G,china(),P));
}int main()
{cs();scanf("%d%d",&N,&G);if (G==P) {puts("0");return 0;}work();return 0;
}

转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5346199.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四、数据预处理——处理连续型特征:二值化与分段

四、数据预处理——处理连续型特征&#xff1a;二值化与分段 点击标题即可获取文章相关的源代码文件哟&#xff01; - sklearn.preprocessing.Binarizer 根据阈值将数据二值化&#xff08;将特征值设置为0或1&#xff09;&#xff0c;用于处理连续型变量。大于阈值的值映射为1&…

LeetCode LCP 55. 采集果实

文章目录1. 题目2. 解题1. 题目 欢迎各位勇者来到力扣新手村&#xff0c;本次训练内容为「采集果实」。 在新手村中&#xff0c;各位勇者需要采集一些果实来制作药剂。 time[i] 表示勇者每次采集 1&#xff5e;limit 颗第 i 种类型的果实需要的时间&#xff08;即每次最多可以…

五、实例:在波士顿房价数据集上用随机森林回归填补缺失值

在波士顿房价数据集上用随机森林回归填补缺失值 点击标题即可获取源代码和笔记 一、引入 我们从现实中收集的数据&#xff0c;几乎不可能是完美无缺的&#xff0c;往往都会有一些缺失值。面对缺失值&#xff0c;很多人选择的方式是直接将含有缺失值的样本删除&#xff0c;这是一…

为什么引入Memcached?

刚memcached了解学习&#xff0c;一直是处于一个懵懂的状态&#xff0c;先是对memcached进行了一个了解&#xff0c;但我们为什么要在ITOO中引入memcached呢&#xff1f;当问我的时候当时自己脑子中打了一个大大的 这就必须去考虑为什么要引入memcached&#xff0c;应该从哪里开…

LeetCode LCP 56. 信物传送(迪杰斯特拉-最短路径)

文章目录1. 题目2. 解题1. 题目 欢迎各位勇者来到力扣城&#xff0c;本次试炼主题为「信物传送」。 本次试炼场地设有若干传送带&#xff0c;matrix[i][j] 表示第 i 行 j 列的传送带运作方向&#xff0c;"^","v","<",">" 这四…

六、Numpy的使用(详解)

3.1.2 ndarray介绍 点击标题即可获取文章的源代码和笔记 Numpy 高效的运算工具 Numpy的优势 ndarray属性 基本操作ndarray.方法()numpy.函数名() ndarray运算逻辑运算统计运算数组间运算 合并、分割、IO操作、数据处理3.1 Numpy优势3.1.1 Numpy介绍 - 数值计算库num - numerica…

PyQt5 入门

文章目录1. 安装测试2. qt 设计师 designer3. 布局管理3.1 使用布局管理器布局3.2 使用容器布局3.3 实践3.4 窗体布局3.5 设置伙伴关系3.6 tab键顺序3.7 Eric 使用4. 信号、槽关联4.1 简单入门4.2 进阶5. 菜单与工具5.1 加载其他窗口主窗体 py子窗口 py调用主程序 py测试6. 打包…

八、Pandas的基本使用

Pandas的基本使用 点击标题即可获取文章源代码和笔记 4.1.0 概要 Pandas基础处理Pandas是什么&#xff1f;为什么用&#xff1f;核心数据结构DataFramePanelSeries基本操作运算画图文件的读取与存储高级处理4.1Pandas介绍4.1.1 Pandas介绍 - 数据处理工具panel data analysis…

4个强大的Linux服务器监控工具[转]

本文介绍了一些可以用来监控网络使用情况的Linux命令行工具。这些工具可以监控通过网络接口传输的数据&#xff0c;并测量目前哪些数据所传输的速度。入站流量和出站流量分开来显示。 一些命令可以显示单个进程所使用的带宽。这样一来&#xff0c;用户很容易发现过度使用网络带…

LeetCode 2248. 多个数组求交集(set)

文章目录1. 题目2. 解题1. 题目 给你一个二维整数数组 nums &#xff0c;其中 nums[i] 是由 不同 正整数组成的一个非空数组&#xff0c;按 升序排列 返回一个数组&#xff0c;数组中的每个元素在 nums 所有数组 中都出现过。 示例 1&#xff1a; 输入&#xff1a;nums [[3,…

九、Pandas高级处理

4.6高级处理-缺失值处理 点击标题即可获取文章源代码和笔记 数据集&#xff1a;https://download.csdn.net/download/weixin_44827418/12548095 Pandas高级处理缺失值处理数据离散化合并交叉表与透视表分组与聚合综合案例4.6 高级处理-缺失值处理1&#xff09;如何进行缺失值处…

用户投票算法

作者: 阮一峰 发布时间: 2012-03-29 13:33 阅读: 7323 次 推荐: 6 原文链接 [收藏] 目录 基于用户投票的排名算法&#xff08;一&#xff09;&#xff1a;Delicious和Hacker News  基于用户投票的排名算法&#xff08;二&#xff09;&#xff1a;Reddit  基于用户…

LeetCode 2255. 统计是给定字符串前缀的字符串数目

文章目录1. 题目2. 解题1. 题目 给你一个字符串数组 words 和一个字符串 s &#xff0c;其中 words[i] 和 s 只包含 小写英文字母 。 请你返回 words 中是字符串 s 前缀 的 字符串数目 。 一个字符串的 前缀 是出现在字符串开头的子字符串。 子字符串 是一个字符串中的连续一…

常用排序讲解

分类&#xff1a; 1&#xff09;插入排序&#xff08;直接插入排序、希尔排序&#xff09;2&#xff09;交换排序&#xff08;冒泡排序、快速排序&#xff09;3&#xff09;选择排序&#xff08;直接选择排序、堆排序&#xff09;4&#xff09;归并排序5&#xff09;分配排序&a…

七、matplotlib的使用

matplotlib的使用 点击标题即可获取文章源代码和笔记 二、Matplotlib2.1 Matplotlib之HelloWorld2.1.1 什么是Matplotlib - 画二维图表的python库mat - matrix 矩阵二维数据 - 二维图表plot - 画图lib - library 库matlab 矩阵实验室mat - matrixlab 实验室2.1.2 为什么要学习M…

LeetCode 2256. 最小平均差(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始长度为 n 的整数数组 nums 。 下标 i 处的 平均差 指的是 nums 中 前 i 1 个元素平均值和 后 n - i - 1 个元素平均值的 绝对差 。两个平均值都需要 向下取整 到最近的整数。 请你返回产生 最小平均差 的下标。 如果有…

十、简单线性回归的python实现(详解)

4. 简单线性回归的python实现 点击标题即可获取源代码和笔记 4.1 导入相关包 import numpy as np import pandas as pd import random import matplotlib as mpl import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [simhei] # 显示中文 plt.rcParams[axes.unic…

LeetCode 2257. 统计网格图中没有被保卫的格子数

文章目录1. 题目2. 解题1. 题目 给你两个整数 m 和 n 表示一个下标从 0 开始的 m x n 网格图。 同时给你两个二维整数数组 guards 和 walls &#xff0c;其中 guards[i] [rowi, coli] 且 walls[j] [rowj, colj] &#xff0c;分别表示第 i 个警卫和第 j 座墙所在的位置。 一…

LeetCode 2259. 移除指定数字得到的最大结果

文章目录1. 题目2. 解题1. 题目 给你一个表示某个正整数的字符串 number 和一个字符 digit 。 从 number 中 恰好 移除 一个 等于 digit 的字符后&#xff0c;找出并返回按 十进制 表示 最大 的结果字符串。 生成的测试用例满足 digit 在 number 中出现至少一次。 示例 1&am…

十一、加权线性回归案例:预测鲍鱼的年龄

加权线性回归案例&#xff1a;预测鲍鱼的年龄 点击文章标题即可获取源代码和笔记 数据集&#xff1a;https://download.csdn.net/download/weixin_44827418/12553408 1.导入数据集 数据集描述&#xff1a; import pandas as pd import numpy as npabalone pd.read_table(&q…