簡體   English   中英

為什么答案是垃圾值?

[英]why the answer is coming garbage value?

#include<bits/stdc++.h>
#define fastio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ll long long
#define M 1000000007
using namespace std;
int main()
{
    fastio;
    int t;
    cin >> t;
    while(t--)
    {
        long n,a;
        cin >> n >> a;
        ll ans=0,x=a,y;
        for(long i=1;i<=n;i++)
        {
            y=pow(x,(2*i-1));
            ans=(ans%M+y%M)%M;
            x=(x*y)%M;
        }
        cout << ans << "\n";
    }
}

鑒於此輸入

1
4 10

我得到了一個垃圾值。 這是為什么?

但是,對於此輸入:

1
3 2

我得到的答案似乎完全沒問題。

我不確定正確的 output 應該是什么,但看起來你有溢出。 pow function 中,您計算整個結果然后取模。 由於結果可能非常大,甚至無法放入long long ,因此在獲取 mod 之前它會溢出,從而得到錯誤的答案。 一個簡單的解決方案是實現一個Pow function,只要它倍增,它就會使用 mod。 該代碼還有一些其他問題,例如導入bits/stdc++.husing namespace stdllM .... 但這無關緊要。 但我想這段代碼是為了解決一些問題。

有問題的代碼可能已解決:

#include<bits/stdc++.h>
#define fastio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ll long long
#define M 1000000007
using namespace std;

long long Pow(int n, int p)
{
    if (p == 0) return 1;

    auto res = Pow(n, p / 2);

    res *= res;
    res %= M;

    if (p % 2 == 1)
        res *= n, res %= M;

    return res;
}

int main()
{
    fastio;
    int t;
    cin >> t;
    while(t--)
    {
        long n,a;
        cin >> n >> a;
        ll ans=0,x=a,y;
        for(long i=1;i<=n;i++)
        {
            y=Pow(x,(2*i-1));
            ans=(ans%M+y%M)%M;
            x=(x*y)%M;
        }
        cout << ans << "\n";
    }
}

輸入:

1 4 10

Output:

707919736

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM