2 条题解

  • 0
    @ 2025-10-8 17:11:14
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const LL P=1e9+7;
    LL f[65][2][2][2][2];
    LL a[65],b[65],k;
    LL dfs(int x,bool f1,bool f2,bool f3,bool f4)
    {
    	if(x==0)return f1;
    	if(f[x][f1][f2][f3][f4]+1)return f[x][f1][f2][f3][f4];
    	int up1=f2?k-1:a[x],up2=f3?k-1:b[x];LL ans=0;
    	for(int i=0;i<=up1;i++)for(int j=0;j<=up2;j++)
    	{
    		if(!f4&&j>i)break;	
    		ans+=dfs(x-1,f1||j>i,f2||i!=up1,f3||j!=up2,f4||j!=i);
    		ans%=P;
    	}
    	f[x][f1][f2][f3][f4]=ans;
    	return ans;
    } 
    LL calc(LL n,LL m)
    {
    	if(m>n)m=n;
    	int len1=0,len2=0;
    	while(n)a[++len1]=n%k,n/=k;
    	while(m)b[++len2]=m%k,m/=k;
    	for(int i=len2+1;i<=len1;i++)b[i]=0;
    	memset(f,-1,sizeof(f));
    	return dfs(len1,0,0,0,0);
    }
    int main()
    {
    	int t;scanf("%d%lld",&t,&k);
    	while(t--)
    	{
    		LL n,m;scanf("%lld%lld",&n,&m);
    		printf("%lld\n",calc(n,m));
    	}
    	return 0;
    }
    
    • 0
      @ 2025-10-8 17:11:07
      #include<bits/stdc++.h>
      using namespace std;
      typedef long long LL;
      const LL P=1e9+7;
      LL f[65][2][2][2][2];
      LL a[65],b[65],k;
      LL dfs(int x,bool f1,bool f2,bool f3,bool f4)
      {
      	if(x==0)return f1;
      	if(f[x][f1][f2][f3][f4]+1)return f[x][f1][f2][f3][f4];
      	int up1=f2?k-1:a[x],up2=f3?k-1:b[x];LL ans=0;
      	for(int i=0;i<=up1;i++)for(int j=0;j<=up2;j++)
      	{
      		if(!f4&&j>i)break;	
      		ans+=dfs(x-1,f1||j>i,f2||i!=up1,f3||j!=up2,f4||j!=i);
      		ans%=P;
      	}
      	f[x][f1][f2][f3][f4]=ans;
      	return ans;
      } 
      LL calc(LL n,LL m)
      {
      	if(m>n)m=n;
      	int len1=0,len2=0;
      	while(n)a[++len1]=n%k,n/=k;
      	while(m)b[++len2]=m%k,m/=k;
      	for(int i=len2+1;i<=len1;i++)b[i]=0;
      	memset(f,-1,sizeof(f));
      	return dfs(len1,0,0,0,0);
      }
      int main()
      {
      	int t;scanf("%d%lld",&t,&k);
      	while(t--)
      	{
      		LL n,m;scanf("%lld%lld",&n,&m);
      		printf("%lld\n",calc(n,m));
      	}
      	return 0;
      }
      • 1

      *【组合数:Lucas定理 + 数位dp】[NOIP2016 提高组] 组合数问题(数据改造版)

      信息

      ID
      6402
      时间
      1000ms
      内存
      256MiB
      难度
      9
      标签
      递交数
      82
      已通过
      8
      上传者