D题:用来对比的vector<long long> b不能被初始化大小成n,因为a里面有n个因子,但是这是可能存在遗漏情况的。如果刚好是遇到实际因子远多于n,那么就会在运行过程中出错。
还有一开始写的时候没有考虑到另一边的因子,只有一半肯定出错。
出错代码:
#include<bits/stdc++.h> using namespace std; #define sc scanf #define pt printf #define maxn 305 #define mll long long int main() { int t; sc("%d",&t); while(t--) { int n,i; sc("%d",&n); vector<mll> a(n); for(i=0;i<n;++i) sc("%lld",&a[i]); sort(a.begin(),a.end()); mll ans = a[0]*a[n-1]; vector<mll> b(n,-1); int cnt = 0; for(i=2;i*1LL*i<=ans;++i) { if(ans%i==0) { b[cnt++]=i; if(ans/i!=i) b[cnt++]=ans/i; } } sort(b.begin(),b.end()); if(a==b) pt("%lld\n",ans); else { pt("-1\n"); } } return 0; }
成功代码:
#include<bits/stdc++.h> using namespace std; #define sc scanf #define pt printf #define maxn 305 #define mll long long int main() { int t; sc("%d",&t); while(t--) { int n,i; sc("%d",&n); vector<mll> a(n); for(i=0;i<n;++i) sc("%lld",&a[i]); sort(a.begin(),a.end()); mll ans = a[0]*a[n-1]; vector<mll> b; for(i=2;i*1LL*i<=ans;++i) { if(ans%i==0) { b.push_back(i); if(ans/i!=i) b.push_back(ans/i); } } sort(b.begin(),b.end()); if(a==b) pt("%lld\n",ans); else { // for(i=0;i<a.size();++i) pt("%lld%c",a[i]," \n"[i==a.size()-1]); // for(i=0;i<b.size();++i) pt("%lld%c",b[i]," \n"[i==b.size()-1]); pt("-1\n"); } } return 0; }
E题:结果和直接得到结果的值都考虑到了要用long long,但是没想到中间的i被设定成int型,由于n最大是200000,为了计算方便,我把n加了1,用于表示被取得的总次数i*(n-i)超过了int的范围,导致出错。
完整错误句子是:a[i]*=( i*(n-i) ); 我真的,可能一开始下意识地觉得a[i]是long long就没关系了吧。
成功代码:
#include<bits/stdc++.h> using namespace std; #define sc scanf #define pt printf #define maxn 200005 #define mll long long #define mod 998244353 mll a[maxn],b[maxn]; int main() { mll n,i; sc("%lld",&n); ++n; for(i=1;i<n;++i) { sc("%lld",&a[i]); a[i]*=( i*(n-i) ); } sort(a+1,a+n); for(i=1;i<n;++i) sc("%lld",&b[i]); sort(b+1,b+n); mll ans = 0; for(i=1;i<n;++i){ ans = ( ans + a[i]%mod*b[n-i]%mod )%mod; } pt("%lld\n",ans); return 0; }
原文:https://www.cnblogs.com/lighten-up-belief/p/10884352.html