CH0102 64位整数乘法 数论
正解:数论/一个神仙想法
解题报告:
先放传送门qwq
两种方法,都还挺妙的就都写了qwq
第一种是快速幂
把b用二进制表示成,ck*2k+ck-1*2k-1+...+c0*20
然后就可以表示成,a*(ck*2k+ck-1*2k-1+...+c0*20)%p
然后就可以用快速幂的思想做掉,能理解趴?
哦其实也可以用秦九韶理解,差不多,反正都这个意思就是了qwq
#include<bits/stdc++.h> using namespace std; #define rp(i,x,y) for(register ll i=x;i<=y;++i) #define ll unsigned long long ll a,b,p; inline ll read() { ;; '))ch=getchar(); ; )+(x<<)+(ch^'),ch=getchar(); return y?x:-x; } inline ll js(ll x,ll y,ll mod) { ll ans=; while(x) { )ans+=y,ans%=mod; x>>=;y<<=;y%=mod; } return ans; } int main() { a=read(),b=read(),p=read(); printf("%lld\n",js(a,b,p)); ; }
第二种是一个,神仙想法
首先很容易能理解就是 a*b%p=a*b-⌊a*b/p⌋*p
然后就可以分成俩部分计算,一个是a*b直接算一个是⌊a*b/p⌋*p
首先理解一个东西,就是因为%p所以答案一定是小于等于p的,那么溢出导致舍弃掉了的部分就没有关系反正本来就是太大了要被废掉的
然后另一个就是⌊a*b/p⌋*p,我们可以先开个double算出⌊a*b/p⌋,考虑精度不够怎么办?没有关系因为double有效数字就是18-19的样子(,,,就是这么巧,被出题人安排得明明白白×)所以舍弃掉的部分刚好就是我们不需要的部分
然后就欧克了
是不是很妙!!!
(然后我开始做的时候还WA了一下,,,解释下发生了什么qwq就是,a和b是要%p的然后我忘了,,,所以就WA了,估计是溢出之类的问题?虽然我本机是A的?真实哭泣QAQ
#include<bits/stdc++.h> using namespace std; #define rp(i,x,y) for(register ll i=x;i<=y;++i) #define ll unsigned long long ll a,b,p,cjk; double goldgenius; inline ll read() { ;; '))ch=getchar(); ; )+(x<<)+(ch^'),ch=getchar(); return y?x:-x; } int main() { a=read(),b=read(),p=read(); cjk=a*b;goldgenius=(double)a*b/p; cjk=cjk-(ll)goldgenius*p;cjk%=p;)cjk+=p; printf("%lld\n",cjk); ; }
umm然后留下一个傻逼问题(,,,其实开始困扰了我半天来着×),这样的
为什么不可以直接算a*b%p呢?
这是因为!可能你舍掉了高位之后膜p会有问题!能懂趴?然后用法二就可以巧妙避免这个问题!
好那这题就解决辣!
CH0102 64位整数乘法 数论的更多相关文章
- CH0101 a^b、 CH0102 64位整数乘法(快速幂、快速乘)【模板题】
题目链接:传送门 //a^b 传送门 //64位整数乘法 题目: 描述 求 a 的 b 次方对 p 取模的值,其中 ≤a,b,p≤^ 输入格式 三个用空格隔开的整数a,b和p. 输出格 ...
- CH0101 a^b & CH0102 64位整数乘法
大数取模的两道题. 虐狗宝典学习笔记: 两个数值执行算术运算时,以参与运算的最高数值类型为基准,与保存结果的变量类型无关.两个32位整数的成绩可能超过int类型的表示范围,但是CPU只会用一个32位寄 ...
- CH 0101 - a^b / CH 0102 - 64位整数乘法 - [快速幂和快速乘]
0101 a^b 题目链接:传送门 描述 求 a 的 b 次方对 p 取模的值,其中 1≤a,b,p≤10^9 输入格式 三个用空格隔开的整数 a,b 和 p. 输出格式 一个整数,表示 a^b mo ...
- AcWing 90. 64位整数乘法
求a*b%p的值. 0<a,b,p<1e18; 原题链接 #include<bits/stdc++.h> #define ull unsigned long long usin ...
- C++的64位整数
在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647.而unsig ...
- C/C++中的64位整数
C/C++中的64位整数(__int64 and long long) 在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31, ...
- windows 64位整数
#include <iostream> #include <ctime> using namespace std; int main() { cout << cou ...
- printf如何输出64位整数
From: http://blog.csdn.net/zzqhost/article/details/6064886 关于printf函数输出64位数的问题,其实在window下和linux下是不一样 ...
- C对64位整数类型的支持
在使用C语言过程中可能需要接触长整数类型,其中包括固定长度数据类型的声明.输入输出函数的标志符等细节,在此记录. int64_t 与 uint64_t C的标准只规定特定数据类型需要实现的最小长度,特 ...
随机推荐
- nginx_lua_waf 部署、测试记录
ngx_lua_waf ngx_lua_waf是一个基于lua-nginx-module(openresty)的web应用防火墙 源码:https://github.com/loveshell/ngx ...
- MongoDB 备份恢复
备份: mongodump --host -u admin -p -o /tmp/alldb/ // 备份所有的库 mongodump --host -u admin -p -d mydb -o /t ...
- 深度缓存ZBuffer线性化
double linearizeDepth(double nearz,double farz,double depth) { depth = 2.0 * depth - 1.0; return (2. ...
- java多线程例子(生成者和消费者)
Info.cs 商品 public class Info { boolean flag=false; private String name="张三"; private int a ...
- 《Lua程序设计》第5章 函数 学习笔记
Lua为面向对象式的调用也提供了一种特殊的语法——冒号操作符.表达式o.foo(o, x)的另一种写法是o:foo(x),冒号操作符是调用o.foo时将o隐含地作为函数的第一个参数.Lua可以调用C语 ...
- Spring系列之IOC容器
一.概述 IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化.定位.配置应用程序中的对象及建立这些对象之间的依赖.应用程序无需直接在代码中new 相关的对象,应用程序由IOC容器进行组装.在S ...
- ubuntu下升级特定软件与查看软件版本信息
ubuntu 升级软件: sudo apt-get update 更新源 sudo apt-get upgrade 更新已安装的包 sudo apt-get dist-upgrade 升级系统 ubu ...
- C#后台传入数据JS接收
今天碰到个问题,就是后台传入的数据,在JS中for循环的时候,下面那个j根本就不会往上加.所以只能将后台传入的对象,转换为json格式,由js进行解析后生成js中的对象 @{j=0;} for (va ...
- Foxmail邮箱最新应用指南 --如何使用「邮件标签」?
Foxmail邮箱最新应用指南--如何使用「邮件标签」? 最近看到很多的朋友收发电子邮件,现在我们帮助讲解下foxmail的标签功能,可以帮助我们整理我们的邮箱,让重要信息浮出水面. 1.鼠标右键邮件 ...
- 游戏服务器学习笔记 4———— master 模块介绍
(模块的介绍方法都是先说大体功能,在捡一些细节详细讨论.) master 类很简单,就3个函数,一个init,设置配置信息,并调用masterapp,然后还有一个循环启动子进程的start函数. 这里 ...