警示后人:60/65,后半部分WA
查看原帖
警示后人:60/65,后半部分WA
522796
M_ZZ楼主2024/9/8 11:03

注意读入范围,一定不能用int进行读入,至少是long long,否则会错

本蒻蒟不会太深奥的位运算,用高精度代替,也不难

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=1e3;
const int INF=2147483647; 
ll n,m,c,k,x,ans,a[MAXN],cnt,sum[MAXN]={0,1},len=1,extra[MAXN];
bool vis[MAXN];
void mul(){
	for(int i=1;i<=len;i++){
		sum[i]<<=1ull;
		sum[i]+=extra[i];
		extra[i+1]=sum[i]/10,sum[i]%=10;
		extra[i]=0;
	}
	if(extra[len+1]){
		sum[++len]+=extra[len];
		extra[len]=0;
	}
}
void subtract(int x){
	int i=0,y;
	while(x){
		i++,y=x%10,x/=10;
		if(sum[i]<y) sum[i]+=10,sum[i+1]--;
		sum[i]-=y;
	}
}
int main(){
	cin>>n>>m>>c>>k;
	ll x,p,q;
	for(int i=1;i<=n;i++){
		scanf("%lld",&x);
		ans|=x;
	}
	while(ans){
		a[++cnt]=ans%2;
		ans/=2;
	}
	for(int i=1;i<=k;i++) vis[i]=true;
	for(int i=1;i<=m;i++){
		scanf("%lld%lld",&p,&q);
		p++;
		if(a[p]==0) vis[p]=false;
	}
	for(int i=k;i>=1;i--) if(vis[i]) mul();
	subtract(n);
	for(int i=len;i>=1;i--) cout<<sum[i];
	return 0;
}
/*
0 0 0 64
*/
2024/9/8 11:03
加载中...