Niuke.com 0x01 基本アルゴリズム - ビット演算
[Niu Ke] C. 64 ビット整数乗算
a を p を法として b で乗算した値を求めます。ただし、0 <= a,b,p <= 1 0 18 10^{18}1 018、p>0
入力説明:
1 行目 a、2 行目 b、3 行目 p。
出力の説明: a × ba × b
を表す整数ある×b モッドモッドモッド pp _ _pの値。
入力例
2
3
9
出力
6
答え
問題は[Niu Ke] A. a^b%pと同じで、2 乗を乗算に変更し、b を 2 進数で表し、ビットごとに乗算し、連続的に剰余を計算するという考え方です。
package org.example;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long a, b, p, ans = 0;
a = in.nextLong();
b = in.nextLong();
p = in.nextLong();
while (b != 0) {
//b转二进制数,最后一位是1
if ((b % 2) != 0) {
//或者(b & 1) ==1 //b转为2进制后当前为是1,ans需要加上a
ans = (ans + a) % p;
}
a = a * 2 % p;
//b右移一位
b >>= 1;
}
System.out.println(ans % p);
}
}