結果
| 問題 | No.3478 XOR-Folding Primes |
| コンテスト | |
| ユーザー |
tau1235
|
| 提出日時 | 2026-03-20 22:39:00 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 286 ms / 4,000 ms |
| コード長 | 1,725 bytes |
| 記録 | |
| コンパイル時間 | 2,413 ms |
| コンパイル使用メモリ | 340,784 KB |
| 実行使用メモリ | 88,536 KB |
| 最終ジャッジ日時 | 2026-03-20 22:39:05 |
| 合計ジャッジ時間 | 4,171 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 8 |
ソースコード
#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>;
int k=1e7+10;
vector<int> sump(k+1);
vector<int> sum(k+1);
void solve(){
int n,m;
cin>>n>>m;
if (n==1){
int ans=sump[m]+1;
cout<<ans<<endl;
return;
}
int cnt=sum[m];
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(){
sieve(k);
isprime[0]=false;
for (int i=0;i<k;i++){
if (i>(i^2)&&isprime[i]&&isprime[i^2]) sum[i]+=2;
sum[i+1]+=sum[i];
sump[i+1]=sump[i]+isprime[i];
}
int t;
cin>>t;
while (t--) solve();
}
tau1235