实数gcd,大数快速乘与组合数取模

2023-05-16

实数gcd

在计算几何的题目中,有时会需要你算两个角度的最大公因数(会有误差),具体操作和整数的gcd类似,但要注意输入可能会有0。

模板如下:

double fgcd(double a,double b)
{
if(fabs(a)<eps) return b;
if(fabs(b)<eps) return a;
return fgcd(b,fmod(a,b));
}//fmod为math库的小数取余函数

大数快速乘

适用于那些中间变量会越界的乘法,快速乘和快速幂的想法基本类似,相当于降一级运算。

模板如下:

LL pow_mul(LL a,LL n,LL m)
{
if(n == 0) return 1;
LL x = pow_mul(a,n>>1,m);
LL ans = (x+x)%m;
if(n&1) ans = (ans+a)%m;
return ans;
}

组合数取模:逆元+lucas定理+CRT+extend_欧几里得算法

题目:2015长春网络赛hdoj5446

地址:http://acm.hdu.edu.cn/showproblem.php?pid=5446

代码:

#include <iostream>
#pragma comment(linker, "/STACK:1024000000,1024000000") 
#include <stdio.h>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <string>
#include <string.h>
#include <sstream>
#include <cctype>
#include <climits>
#include <set>
#include <map>
#include <deque>
#include <queue>
#include <vector>
#include <iterator>
#include <algorithm>
#include <stack>
#include <functional>
/*int类型最大值INT_MAX,short最大值为SHORT_MAX
long long最大值为LONG_LONG_MAX*/
//cout << "OK" << endl;
#define _clr(x,y) memset(x,y,sizeof(x))
using namespace std;
const int INF = INT_MAX;
const double eps = 1e-8;
const double EULER = 0.577215664901532860;
const double PI = 3.1415926535897932384626;
const double E = 2.71828182845904523536028;
typedef long long LL;

int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
LL p[20],ans[20] = {0},n,m,k,t; 
LL pow_mod(LL a,LL n,LL m)
{
	if(n == 0) return 1;
	LL x = pow_mod(a,n>>1,m);
	LL ans = x*x%m;
	if(n&1) ans = ans*a%m;
	return ans;
}
LL f(LL m,LL n,LL p)
{
	if(m > n) return 0;
	LL ans = 1;
	for(int i=1; i<=m; i++)
    {
        LL a = (n + i - m) % p;
        LL b = i % p;
        ans=ans*(a * pow_mod(b, p-2,p) % p) % p;
        //cout << a << " " << pow_mod(b, p-2,p) << endl;
    }
    return ans;
}
LL Lucas(LL m, LL n,LL p)
{
    if(m == 0) return 1;
    return f(m % p, n % p,p) * Lucas(m / p, n / p,p) % p;
}
LL extend_gcd(LL a,LL b,LL &x,LL &y)
{
	if(!b)
	{
		x = 1;y = 0;
		return a;
	}
	else
	{
		LL r = extend_gcd(b,a%b,y,x);
		y-=x*(a/b);
		return r;
	}
}
LL multi(LL a,LL b,LL p)   //大数 (a×b)%p
{
    LL ret=0;
    while(b)
    {
        if(b&1)
            ret=(ret+a)%p;
            a=(a+a)%p;
            b>>=1;
    }
    return ret;

}
LL CRT()
{
	LL M = 1,ret = 0;
	for(int i = 0;i<k;i++)M*=p[i];
	for(int i = 0;i<k;i++)
	{
		LL x,y;
		LL tm = M/p[i];
		extend_gcd(tm,p[i],x,y);
		//cout << tm << " " << x << endl;
		ret = (ret+multi(multi(x,tm,M),ans[i],M))%M;
	}
	return (ret+M)%M;
}
int main()
{
    //freopen("sample.in", "r", stdin);
	//freopen("sample.out", "w", stdout);
	
	scanf("%I64d",&t);
	while(t--)
	{
		_clr(ans,0);
		scanf("%I64d%I64d%I64d",&n,&m,&k);
		for(int i = 0;i<k;i++)
		{
			scanf("%I64d",&p[i]);
			ans[i]= Lucas(m,n,p[i]);
			//cout << ans[i] << endl;
		}
		printf("%I64d\n",CRT());
	}

    //fclose(stdin);
    //fclose(stdout); 
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实数gcd,大数快速乘与组合数取模 的相关文章

随机推荐

  • VUE3中watch和watchEffect的用法

    watch和watchEffect都是监听器 xff0c 但在写法和使用上有所区别 watch在监听 ref 类型时和监听reactive类型时watch函数的写发有所不一样 watch在监听 ref 类型时 xff1a lt script
  • vue项目中遇到的问题 cannot find module “imagemin-gifsicle“

    1 vue项目启动报错信息 error cannot find module imagemin gifsicle 解决方案 xff1a 在packgae json 加上 imagemin gifsicle 如图 xff1a 再次运行时报错信
  • 应届生求职简历HTML模板

    优秀的简历需要具备哪些要素 xff1f 1 逻辑清晰 有条有理 HR面临的动辄几百上千份简历 xff0c 简历需要在5秒内让HR能够get到所有重要信息 2 重点突出 xff0c 简历有亮点用成绩说话 xff01 奖学金 xff0c 荣誉奖
  • 终于理清楚了Promise以及async和await

    promise理解 xff1a 1 xff0c 是js异步编程的新的解决方案 2 xff0c 是一个构造函数 3 xff0c 用来封装一个异步操作 xff0c 并可以获得其结果 promise三个状态 xff1a 1 xff0c pendd
  • 青龙脚本合集(不定期更新版)

    京东pangbai66 ql repo https github com pangbai6 pangbai66 git 34 jd jx gua jddj getJDCookie 34 34 activity backUp 34 34 jd
  • antd vue 表格rowSelection选择框功能的使用

    html部分 xff1a lt a table columns 61 34 columns 34 data source 61 34 showList 34 row selection 61 34 rowSelection 34 rowKe
  • fastjson报错:write javaBean error, fastjson version 1.2.76, class io.undertow.servlet.xx,已解决

    错误信息 xff1a com alibaba fastjson JSONException write javaBean error fastjson version 1 2 76 class io undertow servlet spe
  • Java项目个人博客系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)

    源码获取 xff1a 博客首页 资源 里下载 xff01 一 项目简述 本系统功能包括 xff1a 文章展示 热门文章 文章分类 标签云用户登录评论 匿名评论用户留言 匿名留言评论管理 文章发布 文章管理文章数据统计等等 xff0e 二 项
  • markdown源码

    此文章与http blog csdn net baidu 27435045 article details 52943414为对照博客 此篇为markdown源码 xff0c 另一篇为markdown显示出来的样式 在文字写书写不同数量的
  • npm错误 gyp错误 vs版本不对 msvs_version不兼容

    npm错误 gyp错误 vs版本不对msvs version 不兼容 windows SDK 报错 执行更新GYP 语句第一种方案第二种方案 执行更新GYP 语句 npm install g node gyp 最新的GYP 好像已经不支持P
  • uniapp实现购物车功能

    uniapp实现购物车功能 周六我看见一个有个公司招聘需要试岗3天 xff0c 并使用uniapp完成购物车 xff0c 直播间 xff0c 地图 xff0c 首页四个功能方能通过 xff0c 于是乎 xff0c 我趁手上没事就打算自己写一
  • vue3 setup 语法糖

    Vue3官方提供了 script setup 语法糖 只需在script标签中添加setup xff0c 组件只需引入不用注册 xff0c 属性和方法也不用返回 xff0c 也不用写setup函数 xff0c 也不用写export defa
  • 5_04_GLib库入门与实践_线程池

    简介 线程池是在多线程编程时经常用到的技术 在进行多线程任务处理时 xff0c 如果线程频繁创建和销毁 xff0c 将会使系统开销变大 xff0c 在这种情况下 xff0c 上一个任务执行完后不销毁之前创建的线程 xff0c 后续任务重用该
  • codeforce#dp专项

    1 https codeforces com problemset problem 467 C 题意 给定一个长度为n的序列 xff0c 找到k个长度为m的子串 xff08 不是子序列 xff09 xff0c 求能得到的每个子串相加后的最大
  • Java MyBatis的介绍及其执行原理

    写在前面 MyBatis学习 今天我们进行MyBatis框架的学习 xff0c 认识MyBatis及其执行原理 xff0c 感谢你的阅读 xff0c 内容若有不当之处 xff0c 希望大家多多指正 xff0c 一起进步 xff01 xff0
  • Linux工作目录切换命令

    规则目录指的是用户在系统中所处的位置 xff0c 简单记录几个关于目录操作的命令 1 pwd命令 pwd命令用于显示当前用户所在的工作目录 root 64 ecs 168546 etc pwd etc 2 cd命令 cd命令用于切换工作路径
  • Pytorch Tensor 维度操作的形象理解 Tensor.unsqueeze() Tensor.squeeze()

    我们认为数组 矩阵 张量都是有形状的 xff0c 假如有一个形状是 2 2 3 的张量 a xff0c 从左到右称为第0维 第1维 第2维 我可以使用 a 1 取出第0维视角下的第1组数据 xff0c 可以使用 a 0 看到第2维视角下的第
  • FastAPI学习-9. Swagger文档输出请求示例example

    前言 可以在 Swagger文档上看到请求示例example xff0c 使用Pydantic schema extra属性来实现 schema extra 使用 Config 和 schema extra 为Pydantic模型声明一个示
  • JS的继承(未完待续。。。)

    1 原型链继承 function Animal name this name 61 name 39 Animal 39 this food 61 39 菜 39 this skill 61 39 吃饭 39 39 睡觉 39 39 打豆豆
  • 实数gcd,大数快速乘与组合数取模

    实数gcd 在计算几何的题目中 xff0c 有时会需要你算两个角度的最大公因数 会有误差 xff0c 具体操作和整数的gcd类似 xff0c 但要注意输入可能会有0 模板如下 xff1a double fgcd double a doubl