QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#43723 | #4543. Sumire | _whb | RE | 0ms | 0kb | C++ | 3.0kb | 2022-08-10 12:34:05 | 2022-08-10 12:34:07 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std ;
#define ll long long
const int mod = 1e9 + 7 ;
int T ;
ll k,b,d ;
ll l,r ;
ll f[70][70][2] ;
ll a[70] ;
ll qsm(ll a,ll b)
{
ll ans=1 ;
while(b)
{
if(b&1) ans=(ll)ans*a%mod ;
a=(ll)a*a%mod ; b>>=1 ;
}
return ans ;
}
ll dp(int pos,int num,bool flag,bool iszero)
{
if(num<0) return 0 ;
if(pos==0&&num==0) return 1 ;
if(flag&&f[pos][num][iszero]!=-1) return f[pos][num][iszero] ;
ll x=flag?(b-1):a[pos] ;
ll ans=0 ;
if(x<4)
{
for(ll i=0;i<=x;++i)
ans+=dp(pos-1,num-( (d!=0&&i==d) || (d==0&&i==d&&!iszero) ),flag||(i<x),iszero&&(i==0)),ans%=mod ;
}
else
{
if(iszero)
{
if(!flag)
{
if(d==0) ans+=(x-1)*dp(pos-1,num,1,0)+dp(pos-1,num,0,0)+dp(pos-1,num,1,1) ;
else
{
if(d>x) ans+=(x-1)*dp(pos-1,num,1,0)+dp(pos-1,num,0,0)+dp(pos-1,num,1,1) ;
else if(d==x) ans+=(x-1)*dp(pos-1,num,1,0)+dp(pos-1,num,1,1)+dp(pos-1,num-1,0,0) ;
else if(d<x) ans+=(x-2)*dp(pos-1,num,1,0)+dp(pos-1,num-1,1,0)+dp(pos-1,num,1,1)+dp(pos-1,num,0,0) ;
}
}
else
{
if(d==0) ans+=(x-1)*dp(pos-1,num,1,0)+dp(pos-1,num,1,0)+dp(pos-1,num,1,1) ;
else
{
if(d>x) ans+=x*dp(pos-1,num,1,0)+dp(pos-1,num,1,1) ;
else if(d==x) ans+=(x-1)*dp(pos-1,num,1,0)+dp(pos-1,num,1,1)+dp(pos-1,num-1,1,0) ;
else if(d<x) ans+=(x-2)*dp(pos-1,num,1,0)+dp(pos-1,num-1,1,0)+dp(pos-1,num,1,1)+dp(pos-1,num,1,0) ;
}
}
}
else
{
if(!flag)
{
if(d>x) ans+=x*dp(pos-1,num,1,0)+dp(pos-1,num,0,0) ;
else if(d==x) ans+=x*dp(pos-1,num,1,0)+dp(pos-1,num-1,0,0) ;
else ans+=(x-1)*dp(pos-1,num,1,0)+dp(pos-1,num,0,0)+dp(pos-1,num-1,1,0) ;
}
else
{
if(d>x) ans+=x*dp(pos-1,num,1,0)+dp(pos-1,num,1,0) ;
else if(d==x) ans+=x*dp(pos-1,num,1,0)+dp(pos-1,num-1,1,0) ;
else ans+=(x-1)*dp(pos-1,num,1,0)+dp(pos-1,num,1,0)+dp(pos-1,num-1,1,0) ;
}
}
ans%=mod ;
}
if(flag) f[pos][num][iszero]=ans ;
return ans ;
}
ll calc(ll t)
{
if(t==0) return 0 ;
int pos=0 ;
while(t) a[++pos]=t%b,t/=b ;
ll ans=0 ;
for(int i=1;i<=pos;++i)
{
ll res=dp(pos,i,0,1)%mod ;
//printf("%lld\n",res) ;
ans=(ans+res*qsm(i,k)%mod)%mod ;
}
return ans ;
}
int main()
{
//freopen("in.in","r",stdin) ;
//freopen("out.out","w",stdout) ;
scanf("%d",&T) ;
while(T--)
{
memset(f,-1,sizeof(f)) ;
scanf("%lld%lld%lld%lld%lld",&k,&b,&d,&l,&r) ;
printf("%lld\n",(calc(r)-calc(l-1)+mod)%mod) ;
}
return 0 ;
}
詳細信息
Test #1:
score: 0
Runtime Error
input:
10000 3 207891369 69789899 964252340141144201 993463302889356041 3 747663427 196567324 607861784354966835 737019014793415965 7 4 1 75021281026163040 281275352760223247 159801714 6 4 57793681483331990 719907284728404544 760336565 3 2 640278753805042190 790056554571568287 3 3 0 370833904610234656 7289...