GDKOI2016 Day2 T2 QT与泰剧

本文介绍了一个典型的数位DP问题:求解在给定区间内,与上限模3同余且不完全由质数组成的数的个数。通过详细解析算法流程,包括状态转移方程及实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

T2 QT与泰剧

给出上界S和下界T,求在T+1~S中,模3与S同余并且不全由质数组成的数的个数。

典型数位DP,答案即为ST+23ans。ans为不合法的数的个数。注意细节。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define N 100005
#define mo 10007
using namespace std;
char s[N],st[N];
int f[N][3][2][2][2],len,g[4]={2,3,5,7},ans;
int main() {
    scanf("%s%s",s+1,st+1);len=strlen(s+1);int len1=strlen(st+1);
    int t=0,a=0;fo(i,1,len) t=(t+s[i]-'0')%3,a=(a*10+s[i]-'0')%mo;
    int p=0,b=0;fo(i,1,len1) p=(p+st[i]-'0')%3,b=(b*10+st[i]-'0')%mo;
    int ni=1;fo(i,1,mo-2) ni=(ni*3)%mo;
    fd(i,len,len-len1+1) st[i]=st[i-len+len1];
    fo(i,1,len-len1) st[i]='0';f[0][0][1][1][1]=1;
    fo(i,0,len-1) 
        fo(j,0,2) 
            fo(up,0,1)
                fo(down,0,1)
                    fo(zero,0,1) 
                        if (f[i][j][up][down][zero]) {
                            fo(k,0,3) {
                                if (up&&g[k]>s[i+1]-'0') continue;
                                if (down&&g[k]<st[i+1]-'0') continue;
                                int x=(j+g[k])%3,y=(up&&g[k]==s[i+1]-'0'),
                                z=(down&&g[k]==st[i+1]-'0');
                                f[i+1][x][y][z][0]=(f[i][j][up][down][zero]
                                +f[i+1][x][y][z][0])%mo;
                            }
                            if (zero&&st[i+1]=='0') {
                                int x=(up&&s[i+1]=='0');
                                f[i+1][j][x][1][1]=(f[i][j][up][down][zero]
                                +f[i+1][j][x][1][1])%mo;
                            }
                        }
    fo(i,0,1) ans=(ans+f[len][t][i][0][0])%mo;
    int sum=(a-b+mo)%mo,tot=(t-p+3)%3;
    printf("%d",((sum-tot+mo)%mo*ni%mo+(tot>0)-ans+mo)%mo);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值