【发布时间】:2020-05-26 14:33:23
【问题描述】:
所以我正在解决一个 codeforces 问题并发现了这个......
#include <iostream>
int main()
{
long long var = 1e17;
long long mod = 998244353;
std::cout << var % mod;
}
输出是:
470904831
这实际上不是正确的答案。正确答案是:
470904832
实际上,在问题中,它是使用乘法和加法的模运算符原理的循环,但这是失败的示例之一。
如果有人能告诉我发生了什么,那将有很大帮助。
编辑:我可能有一些误解,我将结果与在线模计算器进行了比较,结果与代码不一致......所以,看看我的代码与问题本身。
问题链接:here。
我在下面的代码中做的事情如下,
我们注意到f(ai,aj)=k可以写成如下,
假设 ai=12 和 aj=34,k=1020 + 304=1324。
我将 1020 称为“左移”,因为从右附加零并且数字左移。
类似的304被称为“右移”,每个数字都被添加到两种形式的最终结果中,并且两种形式都出现了“n”次。
最后,我们只需将它们相加并返回它们的模数。
到此为止,如果我的工作有任何错误,请告诉。
以下是暗示,(请不要对我的做事方式苛刻,我正在学习,如果你可以少几行,请不要评判)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//--<for debugging>
#define whatis(x) cout << #x << " is " << x<<" ";
#define whatisl(x) cout << #x << " is " << x<<"\n";
#define parr(array,end)for(ll loop=0;loop<end;loop++)cout<<array[loop]<<" ";cout<<"\n";
#define lline cout<<"\n";
#define errorl(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args);cout<<"\n";}
#define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args);cout<<"___";}
void err(istream_iterator<string> it) {}
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
cout << *it << " = " << a <<" , ";
err(++it, args...);
}
//--</for debugging>
#define rep(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define testcase ll tt; cin >> tt; while(tt--)
#define boost ios_base::sync_with_stdio(false);cin.tie(NULL);
#define pb push_back
#define vars ll h,i,j,k,d,l,p,q,r,x,y,a,b,c,v,var,n,m,z,s,ans,ind1,ind2,flag,limit1,limit2,limit3,mod;
#define vll vector<ll>
#define pll pair<ll,ll>
#define sll set<ll>
#define pint pair<int,int>
const ll INF=1e9+7;
const ll MOD=998244353;
int main()
{
boost vars
cin>>n;
ll arr[n];
for(i=0;i<n;i++)cin>>arr[i];
ans=0;
for(i=0;i<n;i++)
{
v=arr[i];
s=0;
p=10;
//left shift
while(v)
{
z=v%10;
v/=10;
s=(s+(p*z)%MOD)%MOD;
p=(p*100)%MOD;
//errorl(p);
}
error(s);
a=(s*n)%MOD;s=0;v=arr[i];p=1;
// right shift
while(v)
{
z=v%10;
v/=10;
s=(s+(p*z)%MOD)%MOD;
p=(p*100)%MOD;
}
b=(s*n)%MOD;
ans+=(a+b)%MOD;
errorl(s,a,b,ans);
}
cout<<ans;
}
当 Input = 时代码给出了错误的答案
5
1000000000 1000000000 1000000000 1000000000 1000000000
正确答案是
265359409
我的代码给出了答案 =
2261848115
我非常感谢你诚实的努力,我没想到会有这么多人回复这个。
【问题讨论】:
-
为什么要包含非标准的“bits/”标头?
-
打印
var的值。由于浮点数不准确,很可能它被关闭了:stackoverflow.com/questions/588004/… -
您是如何获得“正确”答案的?见here
-
var=1e17是浮点到long long的转换。 -
@RichardCritten 但这不是错误的原因