結果

問題 No.3478 XOR-Folding Primes
コンテスト
ユーザー askr58
提出日時 2026-03-20 23:08:04
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 764 ms / 4,000 ms
コード長 1,385 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,351 ms
コンパイル使用メモリ 348,804 KB
実行使用メモリ 160,936 KB
最終ジャッジ日時 2026-03-20 23:08:19
合計ジャッジ時間 6,203 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge2_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 8
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
#include <atcoder/modint>
using mint=atcoder::modint998244353;
int main(){
	int ttt;
	cin>>ttt;
	ll maxm=1e7;
	vector<bool> is_prime(maxm+1,true);
	for(int i=2;i<=maxm;i++){
		if(is_prime[i]){
			for(int j=i+i;j<=maxm;j+=i)is_prime[j]=false;
		}
	}
	vector<ll> cnt(maxm+1),cnt2(maxm+1);
	for(int i=2;i<=maxm;i++){
		cnt[i]=cnt[i-1];
		if(is_prime[i])cnt[i]++;
		cnt2[i]=cnt2[i-1];
		if(i>3&&is_prime[i]&&is_prime[i-2]&&(i^(i-2))==2){
			//if(i<30)cout<<i<<endl;
			cnt2[i]++;
		}
	}
			
	while(ttt--){
		ll n,m;
		cin>>n>>m;
		if(n==1){
			cout<<cnt[m]<<endl;
			continue;
		}
		vector<vector<mint>> a(3,vector<mint>(3)),res(3,vector<mint>(3));
		for(int i=0;i<3;i++)for(int j=0;j<3;j++){
			if(i!=j)a[i][j]=1;
		}
		a[0][1]=cnt2[m];
		a[0][2]=cnt2[m];
		for(int i=0;i<3;i++)res[i][i]=1;
		n--;
		while(n>0){
			if(n&1){
				vector<vector<mint>> nres(3,vector<mint>(3));
				for(int i=0;i<3;i++)for(int j=0;j<3;j++)for(int k=0;k<3;k++)nres[i][j]+=a[i][k]*res[k][j];
				res=move(nres);
			}
			vector<vector<mint>> na(3,vector<mint>(3));
			for(int i=0;i<3;i++)for(int j=0;j<3;j++)for(int k=0;k<3;k++)na[i][j]+=a[i][k]*a[k][j];
			a=move(na);
			n>>=1;
		}
		mint ans=0;
		for(int i=0;i<3;i++)for(int j=0;j<3;j++){
			if(i==0)ans+=res[i][j];
			else ans+=res[i][j]*cnt2[m];
		}
		cout<<ans.val()<<endl;
	}
}

		
		

		
0