結果
| 問題 |
No.2406 Difference of Coordinate Squared
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-08-04 23:04:33 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,803 bytes |
| コンパイル時間 | 837 ms |
| コンパイル使用メモリ | 79,784 KB |
| 最終ジャッジ日時 | 2025-02-15 23:15:03 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 47 WA * 8 |
ソースコード
#include<iostream>
#include<vector>
#include<algorithm>
#include<atcoder/modint>
using namespace std;
using ll=long long;
using mint=atcoder::modint998244353;
#define rep(i,n) for(int i=0;i<(n);i++)
#define rrep(i,n) for(int i=(n)-1;i>=0;i--)
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
template<class T> bool chmax(T &a, T b){if (a < b){a = b;return true;} else return false;}
template<class T> bool chmin(T &a, T b){if (a > b){a = b;return true;} else return false;}
const ll MOD=998244353;
const int MAX=2e6+10;
vector<mint>fac(MAX),finv(MAX),inv(MAX);
void set_fac(){
fac[0]=fac[1]=1;
finv[0]=finv[1]=1;
inv[1]=1;
for (int i=2;i<MAX;i++){
fac[i]=fac[i-1]*i;
inv[i]=-inv[MOD%i]*(MOD/i);
finv[i]=finv[i-1]*inv[i];
}
}
mint cmb(int n,int r){
if (r<0||n<r)return 0;
return fac[n]*finv[r]*finv[n-r];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
set_fac();
ll N,M;
cin>>N>>M;
M=abs(M);
ll p=1;
mint ans=0,P4=mint(4).pow(N);
while(p*p<=M){
if(M%p==0){
int q=M/p;
if((p+q)%2==0){
ll x=abs((p+q)/2),y=abs((p-q)/2);
if((x+y)%2==N%2){
for(int i=x;i<=N;i+=2){
int b=(i-x)/2,a=x+b;
int j=N-i;
int d=(j-y)/2,c=y+d;
if(d>=0){
mint r=fac[N]*finv[a]*finv[b]*finv[c]*finv[d];
if(x==0&&y==0)ans+=r;
else if(x==0||y==0)ans+=2*r;
else ans+=4*r;
}
}
}
}
}
p++;
}
ans/=P4;
cout<<ans.val()<<"\n";
}