64位整数乘法
求 a 乘 b 对 p 取模的值。
输入格式
第一行输入整数a,第二行输入整数b,第三行输入整数p。
输出格式
输出一个整数,表示a*b mod p的值。
数据范围
1≤a,b,p≤1018
看到这个数据范围有点茫然 跑去查了下unsigned long long
最近做题的时候,经常遇到范围是263,取模264的这种题目。遇到这种限制条件时就要想到用unsigned long long类型。
而ll的范围是[-263,263-1],因为有符号的第63位表示“正负”而不表示数值
——unsigned long long类型与long long类型 - Skyline - 优快云博客
于是发现unsigned long long
都过不了…
一翻题解 原来可以用类似于快速幂的方法做
例如a=2,b=7
b=7=20+21+22
也是可以借助位运算的,只不过固定了底数为2,算答案时也不是乘,而是加
emmm…说不清楚看代码吧
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
long long a,b,p,ans=0;
scanf("%lld %lld %lld",&a,&b,&p);
while(b)
{
if(b&1)
ans=(ans+a)%p;
a=(a*2)%p;
b>>=1;
}
printf("%lld\n",ans);
return 0;
}