本文已参与「新人创作礼」活动,一起开启掘金创作之路。
@TOC
64位整数乘法
题目描述
求对取模的值
问题分析
先不考虑
利用(其中表示向下取整)
记为,为
问题有个,一是如何计算出,而是如何计算
因为在十进制下的有效数字有~位,当时也一定小于。所以可以胜任,再把结果强制转换为即可。由此计算。
因为其实就是,所以,又因为溢出时相当于对自动取模,所以由此计算。
时间复杂度为
64位整数乘法模板
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a, ll b, ll mod)
{
a %= mod, b %= mod;
ull c = (long double)a * b / mod;
ull x = a * b, y = c * mod;
ll ans = (ll)x % mod - (ll)y % mod;
if (ans < 0)
ans += mod;
return ans;
}
AcWing-90. 64位整数乘法
Problem Description
求对取模的值
Tips
AC代码
#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a, ll b, ll mod)
{
a %= mod, b %= mod;
ull c = (long double)a * b / mod;
ull x = a * b, y = c * mod;
ll ans = (ll)x % mod - (ll)y % mod;
if (ans < 0)
ans += mod;
return ans;
}
int main()
{
ll a, b, c;
cin >> a >> b >> c;
cout << mul(a, b, c) << endl;
return 0;
}
同步发文于我的CSDN,原创不易,转载请附上原文链接哦~
Tisfy:letmefly.blog.csdn.net/article/det…