P4714 「数学」约数个数和
题解:
会了Miller-Rabin这题就很简单了
首先这种题很容易想到质因数分解
但是暴力根号算法是不行的
所以要用到
Miller-Rabin素数
https://blog.csdn.net/ltyqljhwcm/article/details/53045840
对于要判断的数n
1.先判断是不是2,是的话就返回true。
2.判断是不是小于2的,或合数,是的话就返回false。
3.令n-1=u*2^t,求出u,t,其中u是奇数。
4.随机取一个a,且1<a<n
/*根据费马小定理,如果a^(n-1)≡1(mod p)那么n就极有可能是素数,如果等式不成立,那肯定不是素数了
因为n-1=u*2^t,所以a^(n-1)=a^(u*2^t)=(a^u)^(2^t)。*/
5.所以我们令x=(a^u)%n
6.然后是t次循环,每次循环都让y=(x*x)%n,x=y,这样t次循环之后x=a^(u*2^t)=a^(n-1)了
7.因为循环的时候y=(x*x)%n,且x肯定是小于n的,正好可以用二次探测定理,
如果(x^2)%n==1,也就是y等于1的时候,假如n是素数,那么x==1||x==n-1,如果x!=1&&x!=n-1,那么n肯定不是素数了,返回false。
8.运行到这里的时候x=a^(n-1),根据费马小定理,x!=1的话,肯定不是素数了,返回false
9.因为Miller-Rabin得到的结果的正确率为 75%,所以要多次循环步骤4~8来提高正确率
10.循环多次之后还没返回,那么n肯定是素数了,返回true
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int kk=;
ll n;
ll C(ll x,ll y)
{
if (y==) return(x);
if (y%==) return(((C(x,y/)*)%n+x)%n);
else return((C(x,y/)*)%n);
}
ll M(ll x,ll y)
{
if (y==) return(x);
ll tmp=M(x,y/);
if (y%==) return(C(C(tmp,tmp),x));
else return(C(tmp,tmp));
}
bool pd()
{
if (n==) return ;
if (n<) return ;
ll m=n-;
int k=;
while (!(m&))
{
k++; m>>=;
}
for (int i=;i<=kk;i++)
{
ll x1=rand()%(n-)+;
ll x2=M(x1,m);
ll y=;
for (int j=;j<=k;j++)
{
y=C(x2,x2);
if (y==&&x2!=&&x2!=n-) return ;
x2=y;
}
if (y!=) return ;
}
return ;
}
int main()
{
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
while (cin>>n)
{ if (pd()) cout<<"T"; else cout<<"F";
cout<<endl;
}
return ;
}
Pollard-rho算法:
P4714 「数学」约数个数和的更多相关文章
- 洛谷 P4714 「数学」约数个数和 解题报告
P4714 「数学」约数个数和 题意(假):每个数向自己的约数连边,给出\(n,k(\le 10^{18})\),询问\(n\)的约数形成的图中以\(n\)为起点长为\(k\)的链有多少条(注意每个点 ...
- luogu 6月月赛 E 「数学」约数个数和
题面在这里! 第一眼感觉炒鸡水啊...只要把N质因数分解一下,因为k次约数相当于求k+2元一次方程的非负整数解,所以答案就是和每个质因子指数有关的一些组合数乘起来. 但是要用pillard's rho ...
- 【LGP4714】「数学」约数个数和
题目 众所周知,除数个数函数\(\sigma_0=I^2\),\(I\)就是狄利克雷卷积里的\(1\)函数 于是熟悉狄利克雷卷积的话很快就能看出我们要求的就是\(I\times I^{k}\),即\( ...
- 「BZOJ 3994」「SDOI 2015」约数个数和「莫比乌斯反演」
题意 设\(d(x)\)为\(x\)的约数个数,求\(\sum_{i=1}^{n}\sum_{j=1}^{m}d(ij)\). 题解 首先证个公式: \[d(ij) = \sum_{x|i}\sum_ ...
- 「10.8」simple「数学」·walk「树上直径」
A. Simple 本来以为很难,考场瞎推了推好像会了...... 想起小凯的诱惑,迷?? 首先$n$,$m$,$q$同除$gcd(n,m)$,显然$q$以内的数假如不是$gcd$的倍数,那么一定不能 ...
- Codeforces 626E Simple Skewness 「数学」「二分」
题意: 给你一堆无序数,寻找它的一个子堆,使得子堆的平均数减中位数最大. 数字的个数n<=2e5 0<=xi<=1e6. 思路: 首先可以证明这堆数一定是奇数个,证明方法是尝试在奇数 ...
- Loj 3058. 「HNOI2019」白兔之舞
Loj 3058. 「HNOI2019」白兔之舞 题目描述 有一张顶点数为 \((L+1)\times n\) 的有向图.这张图的每个顶点由一个二元组 \((u,v)\) 表示 \((0\le u\l ...
- 「MoreThanJava」计算机发展史—从织布机到IBM
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- 「MoreThanJava」一文了解二进制和CPU工作原理
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
随机推荐
- C# 基础之const
1.使用 const 关键字来声明某个常量字段或常量局部变量.常量字段和常量局部变量不是变量并且不能修改. 常量可以为数字.布尔值.字符串或 null 引用(Constants can be numb ...
- unity实现剧情对话
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { private string show ...
- T-SQL 日期函数
GETDATE() 它将返回当前日期和时间. 语法 上述函数的语法: GETDATE() 例 以下查询将返回当前日期以及MS SQL Server中的时间. Select getdate() as c ...
- .net常用的代码生成工具
之前很多从事C#开发的用过动软代码生成器,然后随着IT技术的快速发展,涌现出很多优秀的工具关于.Net的,首推微软的Entity Framework,其次是NHibernate.Entity Fram ...
- Gradle更小、更快构建APP的奇淫技巧
本文已获得原作者授权同意,翻译以及转载原文链接:Build your Android app Faster and Smaller than ever作者:Jirawatee译文链接:Gradle更小 ...
- 分享几个Android很强势的的开源框架
前言 今天介绍一下android开发者中比较热门的开源代码,这些代码绝大多数可以直接应用到项目中.更多可参考很值得收藏的安卓开源控件库 一个强大的图片选择器,支持多选,和选聘选择 项目地址: http ...
- Confluence 6 配置一个 Confluence 环境
本部分对你 Confluence 的外部设置进行描述.包括有如何配置 Web 服务器,应用服务器,目录和文件等信息—— Confluence 运行所需要的所有环境.有关在服务器内部对配置进行修改的内容 ...
- leetcode(js)算法89之格雷编码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头 示例 1: 输入: 2 输出: [ ...
- 中介模型以及优化查询以及CBV模式
一.中介模型:多对多添加的时候用到中介模型 自己创建的第三张表就属于是中介模型 class Article(models.Model): ''' 文章表 ''' title = models.Char ...
- 利用map和stringstream数据流解题
题目描述 喜闻乐见A+B.读入两个用英文表示的A和B,计算它们的和并输出. 输入 第一行输入一个字符串,表示数字A:第二行输入一个字符串表示数字B.A和B均为正整数. 输出 输出一个正整数n,表示A+ ...