小w的a+b问题(二进制)

考虑: − 2147483648 = 2147483647 + 1 −2147483648=2147483647+1 −2147483648=2147483647+1

2147483647 + 2147483647 = − 2 2147483647+2147483647=-2 2147483647+2147483647=−2

即:

0111   1111   1111   1111   1111   1111   1111   1111 0111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111 0111 1111 1111 1111 1111 1111 1111 1111

0111   1111   1111   1111   1111   1111   1111   1111 0111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111 0111 1111 1111 1111 1111 1111 1111 1111

= 1111   1111   1111   1111   1111   1111   1111   1110 = − 2 =1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1110=-2 =1111 1111 1111 1111 1111 1111 1111 1110=−2

要得到 − 3 -3 −3,即 2147483647 + ( 2147483647 − 1 ) 2147483647+(2147483647-1) 2147483647+(2147483647−1)即可。

所以 [ − 2 , − 2147483648 ] [-2,-2147483648] [−2,−2147483648]都可表示。

− 1 -1 −1不能表示。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define il inline
int main(){
int a=INT_MAX,c;
scanf("%d",&c);
if(c==-1) puts("No solution");
else printf("%d %d\n",a,c-a);
return 0;
}

小w的a=b问题

思路: h a s h hash hash或质因数分解。

1.考虑多重 h a s h hash hash+预处理阶乘特判即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=2e4+5,inf=0x3f3f3f3f;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define il inline
int mod[2]={998244353,1000000007};
ll fac[N][2];
int main(){
fac[0][0]=fac[0][1]=1;
for(int j=0;j<2;j++)
for(int i=1;i<=1e5;i++) fac[i][j]=fac[i-1][j]*i%mod[j];
int t;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
ll x[2]={1,1},y[2]={1,1};
for(int i=1;i<=n;i++){
int a;
scanf("%d",&a);
for(int j=0;j<2;j++) x[j]=x[j]*fac[a][j]%mod[j];
}
for(int i=1;i<=m;i++){
int b;
scanf("%d",&b);
for(int j=0;j<2;j++) y[j]=y[j]*fac[b][j]%mod[j];
}
puts(x[0]==y[0]&&x[1]==y[1]?"equal":"unequal");
}
return 0;
}

2.将阶乘拆分为若干质数,然后特判每个数个数是否对应相等。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=2e4+5,inf=0x3f3f3f3f;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define il inline
int a[N],p[N],s1[N],s2[N];
void ss(int n){
int cnt=0;a[0]=1;
for(int i=2;i<=n;i++){
if(!a[i]) p[cnt++]=i;
for(int j=0;j<cnt&&i*p[j]<=n;j++){
a[i*p[j]]=i;
if(i%p[j]==0) break;
}
}
}
int main(){
int t;
ss(1e5);
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
int mx=0;
for(int i=1,a;i<=n;i++){
scanf("%d",&a);
s1[a]++;
if(a>mx) mx=a;
}
for(int i=1,b;i<=m;i++){
scanf("%d",&b);
s2[b]++;
if(b>mx) mx=b;
}
for(int i=mx;i;i--) s1[i]+=s1[i+1],s2[i]+=s2[i+1];
for(int i=mx;i;i--){
if(a[i]){
s1[a[i]]+=s1[i],s1[i/a[i]]+=s1[i],s1[i]=0;
s2[a[i]]+=s2[i],s2[i/a[i]]+=s2[i],s2[i]=0;
}
}
int ok=1;
for(int i=2;i<=mx;i++)
if(s1[i]!=s2[i]){
ok=0;
break;
}
puts(ok?"equal":"unequal");
for(int i=1;i<=mx;i++) s1[i]=s2[i]=0;
}
return 0;
}