CC想知道所有满足(0<=i<=n)(0<=k<=m)且不能被3整除的组合数的个数模998244353的结果。
即计算
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll dp[100][2][2];
int num1[100],num2[100];
bool visit[100][2][2];
const ll mod=998244353;
void add(ll &x,ll y){x+=y;if(x>=mod)x-=mod;}
ll dfs(int len,bool limit1,bool limit2){
if(len==0)return 1ll;
if(visit[len][limit1][limit2])return dp[len][limit1][limit2];
visit[len][limit1][limit2]=1;
int f1=limit1?num1[len]:2; int f2=limit2?num2[len]:2;
ll ans=0;
for(int i=0;i<=f1;++i){
int f3=min(i,f2);
for(int j=0;j<=f3;++j){
add(ans,dfs(len-1,limit1&&(i==num1[len]),limit2&&(j==num2[len])));
}
}
dp[len][limit1][limit2]=ans;
return ans;
}
ll cal(ll n,ll m){
memset(visit,0,sizeof(visit));
m=min(n,m);
int len=0;
while(n)num1[++len]=n%3,n/=3;
for(int i=1;i<=len;++i)num2[i]=0;
int len2=0;
while(m)num2[++len2]=m%3,m/=3;
return dfs(len,1,1);
}
int main(){
int t;
ll n,m;
scanf("%d",&t);
while(t--){
scanf("%lld%lld",&n,&m);
printf("%lld\n",cal(n,m));
}
}