kmjp's blog

競技プログラミング参加記です

yukicoder : No.1444 !Andd

この問題タイトルはなんだろう。
https://yukicoder.me/problems/no/1444

問題

N個の正整数A[i]が与えられる。
変数Xがあり、初期値は0である。
各A[i]に対し、

  • X = X × A[i]
  • X = X and A[i]

のいずれかによりXの値を更新することを考える。
処理毎に、Xの取りえる値は何通りあるか求めよ。
ただし、Aは1024未満の非負整数である。

解法

ほぼNo.1443と同じだが、A[i]=0の時だけはいずれにせよX=0になるので注意。
yukicoder : No.1443 Andd - kmjp's blog

int N;
int fu[1024],fo[1024];
int tu[1024],to[1024];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N;
	fu[1]=1;
	FOR(i,N) {
		cin>>x;
		ZERO(to);
		ZERO(tu);
		FOR(j,1024) {
			if(fu[j]) {
				tu[j&x]=1;
				if(j*x>=1024) {
					to[(j*x)&1023]++;
				}
				else {
					tu[j*x]=1;
				}
			}
			if(fo[j]) {
				tu[j&x]=1;
				if(x==0) tu[0]=1;
				else to[(j*x)&1023]+=fo[j];
			}
		}
		swap(to,fo);
		swap(tu,fu);
		int sum=0;
		FOR(j,1024) sum+=fo[j]+fu[j];
		cout<<sum<<endl;
	}
}

まとめ

よいひねり方。