c++ - 为什么答案是垃圾值?
问题描述
#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
我得到的答案似乎完全没问题。
解决方案
我不确定正确的输出应该是什么,但看起来你有溢出。在pow
函数中,您计算整个结果然后取模。由于结果可能非常大,甚至无法放入long long
,因此在获取 mod 之前它会溢出,从而得到错误的答案。一个简单的解决方案是实现一个Pow
函数,该函数在 mod 倍增时采用该函数。该代码还有一些其他问题,例如导入bits/stdc++.h
,和.... 但这无关紧要。但我想这段代码是为了解决一些问题。using namespace std
ll
M
有问题的代码可能已解决:
#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
输出:
707919736
推荐阅读
- python - Pandas 新列具有来自相同 id 的值,遵循代码
- css - 在 Wordpress 中下载自定义字体时出错
- intellij-idea - 如何为 IntelliJ 设置 $PATH(在 mac 上)?
- html - 滚动条仅在表格的一个 TD 单元格中?
- go - 如何模拟net.Interface
- django - modelformset 根据 django 中的 ModelChoiceField 显示表单
- udp - Linux 上传入网络包的延迟 - 如何分析?
- sql - 在 SQL 中计算年度升级
- css - 在反应组件中转译 CSS 类名无法正常工作
- python - 卡在用 python 将图像制作成 ascii 程序的最后一部分