zoukankan      html  css  js  c++  java
  • 【CF628D】Magic Numbers 数位DP

    【CF628D】Magic Numbers

    题意:求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数(这里的偶数位是的是从高位往低位数的偶数位)。$a,b<10^{2000},m le 2000 ,0 le d le 9$

    题解:用f[i][j]表示有i+1位,第i位是d,且%m=j的数的个数。(这个状态可能有点奇怪,不过比较便于转移)然后转移方式还是惯用的方法,判一下如果原数的偶数位不是d或者奇数位是d则停止计算即可。

    对了,题意有bug。题里说个位数的偶数位是0,但是数据里个位数的偶数位可以被视为任何数。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    const ll P=1000000007;
    int n,m,d;
    ll B[2010],f[2010][2010];
    int v[2010];
    char str[2010];
    inline void upd(ll &a,const ll &b) {a=(a+b)%P;}
    inline void init()
    {
    	int i,j,k;
    	for(B[1]=1,i=2;i<=2000;i++)	B[i]=B[i-1]*10%m;
    	f[1][d%m]=1;
    	f[0][0]=1;
    	//for(i=0;i<=9;i++)	if(i!=d)	f[2][(d*10+i)%m]++;
    	for(i=0;i<1999;i++)	for(j=0;j<m;j++)	for(k=0;k<=9;k++)	if(k!=d)
    		upd(f[i+2][(j+B[i+1]*k+B[i+2]*d)%m],f[i][j]);
    }
    inline ll calc(int flag)
    {
    	scanf("%s",str),n=strlen(str);
    	int i,j;
    	for(i=1;i<=n;i++)	v[i]=str[n-i]-'0';
    	if(n==1&&v[1]==0)	return 0;
    	if(flag)
    	{
    		v[1]--;
    		for(i=1;i<=n;i++)	if(v[i]<0)	v[i]+=10,v[i+1]--;
    		while(n>1&&!v[n])	n--;
    	}
    	if(n==1&&v[1]==0)	return 0;
    	ll ans=0,now=0;
    	for(i=0;i<n-1;i++)	for(j=1;j<=9;j++)	if(j!=d)	upd(ans,f[i][(m-B[i+1]*j%m)%m]);
    	for(i=n;i>=1;i--)
    	{
    		if((i^n)&1)
    		{
    			if(v[i]>d)	upd(ans,f[i][(m-now)%m]);
    			if(v[i]!=d)	break;
    		}
    		else
    		{
    			for(j=(i==n);j<v[i];j++)	if(j!=d)	upd(ans,f[i-1][(2*m-now-B[i]*j%m)%m]);
    			if(v[i]==d)	break;
    		}
    		now=(now+v[i]*B[i])%m;
    	}
    	if(!i&&!now)	upd(ans,1);
    	return ans;
    }
    int main()
    {
    	scanf("%d%d",&m,&d);
    	init();
    	ll a=calc(1),b=calc(0);
    	printf("%I64d",(b-a+P)%P);
    	return 0;
    }//1 4 1 9
  • 相关阅读:
    UVA 10617 Again Palindrome
    UVA 10154 Weights and Measures
    UVA 10201 Adventures in Moving Part IV
    UVA 10313 Pay the Price
    UVA 10271 Chopsticks
    Restore DB後設置指引 for maximo
    每行SQL語句加go換行
    种服务器角色所拥有的权限
    Framework X support IPV6?
    模擬DeadLock
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7814462.html
Copyright © 2011-2022 走看看