結果
| 問題 | No.3478 XOR-Folding Primes |
| コンテスト | |
| ユーザー |
tau1235
|
| 提出日時 | 2026-03-20 22:34:28 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,623 bytes |
| 記録 | |
| コンパイル時間 | 3,588 ms |
| コンパイル使用メモリ | 338,604 KB |
| 実行使用メモリ | 22,344 KB |
| 最終ジャッジ日時 | 2026-03-20 22:34:44 |
| 合計ジャッジ時間 | 13,605 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 6 TLE * 2 |
ソースコード
#include<bits/stdc++.h>
#include<atcoder/modint>
using namespace std;
vector<bool> isprime;
vector<int> sieve(int n){
vector<int> prime;
isprime=vector<bool>(n+1,true);
isprime[1]=false;
for (int i=2;i<=n;i++){
if (!isprime[i]) continue;
prime.push_back(i);
for (int j=i*2;j<=n;j+=i){
isprime[j]=false;
}
}
return prime;
}
template<typename T,int N>
struct Matrix{
array<array<T,N>,N> val;
Matrix(){
for (int i=0;i<N;i++) for (int j=0;j<N;j++) val[i][j]=T(0);
}
array<T,N> &operator[](int i){return val[i];}
const array<T,N> &operator[](int i)const{return val[i];}
Matrix operator*(const Matrix &b){
Matrix a=*this,c;
for (int i=0;i<N;i++){
for (int j=0;j<N;j++){
for (int k=0;k<N;k++){
c[i][j]+=a[i][k]*b[k][j];
}
}
}
return c;
}
Matrix e(){
Matrix ret;
for (int i=0;i<N;i++) ret.val[i][i]=1;
return ret;
}
Matrix pow(long long k){
Matrix ret=e(),m=*this;
while (k>0){
if (k%2==1) ret=ret*m;
m=m*m;
k/=2;
}
return ret;
}
};
using mint=atcoder::modint998244353;
using mat=Matrix<mint,2>;
void solve(){
int n,m;
cin>>n>>m;
sieve(m);
isprime[0]=false;
if (n==1){
int ans=0;
for (int i=0;i<=m;i++) ans+=isprime[i];
cout<<ans<<endl;
return;
}
int cnt=0;
for (int i=0;i<=m;i++) cnt+=(i^2)<=m&&isprime[i]&&isprime[i^2];
mat mat;
mat[0]={0,1};
mat[1]={cnt,1};
mat=mat.pow(n-1);
mint ans=1*(mat[0][0]+mat[1][0])+cnt*(mat[0][1]+mat[1][1]);
cout<<ans.val()<<endl;
}
int main(){
int t;
cin>>t;
while (t--) solve();
}
tau1235