QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#43722 | #4543. Sumire | _whb | RE | 0ms | 0kb | C++ | 3.2kb | 2022-08-10 12:32:53 | 2022-08-10 12:32:55 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std ;
#define ll long long
const ll mod = 1000000007 ;
ll 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 ; a%=mod ;
while(b)
{
if(b&1) ans=ans*a%mod ;
a=a*a%mod ; b>>=1 ;
}
return ans ;
}
ll dp(ll pos,ll 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)%mod+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)%mod+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)%mod+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)%mod+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)%mod+dp(pos-1,num,1,0)+dp(pos-1,num,1,1) ;
else
{
if(d>x) ans+=x*dp(pos-1,num,1,0)%mod+dp(pos-1,num,1,1) ;
else if(d==x) ans+=(x-1)*dp(pos-1,num,1,0)%mod+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)%mod+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)%mod+dp(pos-1,num,0,0) ;
else if(d==x) ans+=x*dp(pos-1,num,1,0)%mod+dp(pos-1,num-1,0,0) ;
else ans+=(x-1)*dp(pos-1,num,1,0)%mod+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)%mod+dp(pos-1,num,1,0) ;
else if(d==x) ans+=x*dp(pos-1,num,1,0)%mod+dp(pos-1,num-1,1,0) ;
else ans+=(x-1)*dp(pos-1,num,1,0)%mod+dp(pos-1,num,1,0)+dp(pos-1,num-1,1,0) ;
}
}
ans%=mod ;
}
if(flag) f[pos][num][iszero]=ans%mod ;
return ans ;
}
ll calc(ll t)
{
if(t==0) return 0LL ;
ll pos=0 ;
while(t>0) a[++pos]=t%b,t/=b ;
ll ans=0 ;
for(ll 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 ;
}
signed main()
{
//freopen("in.in","r",stdin) ;
//freopen("out.out","w",stdout) ;
scanf("%lld",&T) ;
while(T--)
{
for(ll i=0;i<70;++i)
for(ll j=0;j<70;j++)
for(ll k=0;k<2;k++) f[i][j][k]=-1 ;
scanf("%lld%lld%lld%lld%lld",&k,&b,&d,&l,&r) ;
printf("%lld",(calc(r)-calc(l-1)+mod)%mod) ;
if(T>=0) puts("") ;
}
return 0 ;
}
Details
Tip: Click on the bar to expand more detailed information
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...