B交换数字
我们要考虑怎么交换能够使a * b 最小,证明:由于我们交换任意位置的数字,a+b 的值恒为定值,只会改变 a−b 的值,而我们知道 4ab=(a+b) * (a+b) − (a−b) * (a-b),于是我们最大化 a−b 的值即可最小化 ab 的值。不需要高精度每一步取模即可
#include <bits/stdc++.h>
using namespace std;
int n;
const int mod=998244353;
const int N=2e5+10;
int a[N],b[N];
void kei()
{
for(int i=1;i<=n;i++)
{
char c;
cin>>c;
a[i]=c-'0';
}
for(int i=1;i<=n;i++)
{
char c;
cin>>c;
b[i]=c-'0';
}
for(int i=1;i<=n;i++)
if(a[i]>b[i])swap(a[i],b[i]);
long long l=0,r=0;
for(int i=1;i<=n;i++)
{
l=(l*10+a[i])%mod;
r=(r*10+b[i])%mod;
}
cout<<(l*r)%mod;
}
int main()
{
cin>>n;
kei();
return 0;
}
C老虎机
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
#define int long long
int qpow(int a,int b)//快速幂
{
int res=1;
while(b)
{
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
void solve()
{
int m,a,b,c;
cin>>m>>a>>b>>c;
int ans=0,tot=m*m%mod*m%mod;
ans+=3*m*(m-1)*b; //两个相同
ans+=m*c; //都相同
ans+=(tot-3*m*(m-1)-m)*a; //均不同
ans=(ans%mod+mod)%mod;
//有的编译器,计算5%3=2;有的算出来5%3=-1
//为了避免两种的差别
//我们统一用:ans=(ans+mod)%mod
//就可以把这个都化成正的最小的那个啦
ans=ans*qpow(tot,mod-2)%mod;
cout<<ans<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}