C++ 中 pow() 函数的输出没有给出准确的答案

Output of pow() function in C++ is not giving acccurate answer

我正在尝试解决一个问题。用户将输入一个整数然后对其进行平方我必须找到 mod。但是当我给出大整数时 pow() 给出了错误的答案。我该如何解决?

#include<bits/stdc++.h>

using namespace std;

int main()
{
    //ios_base:: sync_with_stdio(false);
    //cin.tie(NULL);
    int t;
    cin>>t;
    for(int i=0;i<t;i++)
    {

        long long  n;
        cin>>n;

        long long  sn=0;
        sn=pow(n,2);
        long long v = pow(10,9)+7;

        cout<<sn%v<<endl;

    }
}

正如评论所说,pow 适用于浮点数。因为你想对整数进行平方,所以最好使用 sn = n*n 将它们相乘。如果您使用 unsigned long long,您将能够准确计算平方,但前提是该平方最多为 +18,446,744,073,709,551,615(参见 https://en.m.wikipedia.org/wiki/C_data_types

解决这个问题的诀窍是更早地计算模数。 Modular arithmetic 为此提供了一些机会。

对于这个问题,请注意 (a * b) % m == (a % m) * (b % m)

而且 1000000007^2 仍然适合 64 位 int,所以结果总是足够小。

因此代码的相关部分可能如下所示

const int64_t m = 1000000007;
int64_t n;
cin>>n;

n = n % m;
int64_t sn = n * n;
sn = sn % m;

cout << sn << endl;