首页 > 其他分享 >abc135d 模13余5的数的个数

abc135d 模13余5的数的个数

时间:2024-03-15 20:44:48浏览次数:15  
标签:std 13 int MInt rep 个数 abc135d dp

给定一个由0~9以及?组成的字符串,其中的?可以替换成0~9中任意1个数字,问有多少种情况使得这个数字模13的余数为5?结果对1e9+7取模。注意允许s有前导0。
1<=|s|<=1e5

记dp[i][j]表示前i个数字构成的数,模13余j的方案数。如果s[i]是数字,直接转移;如果是问题,枚举0~9所有可能分别枚举,总时间复杂度O(13n)。这里使用的刷表法。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=b;i>=a;i--)

template<int MOD>
struct MInt {
    int x;
    int norm(int u) const {u%=MOD; if(u<0) u+=MOD; return u;}
    MInt(int v=0):x(norm(v)) {}
    int val() const {return x;}
    MInt operator-() const {return MInt(norm(MOD-x));}
    MInt inv() const {assert(x!=0); return power(MOD-2);}
    MInt &operator*=(const MInt &o) {x=norm(x*o.x); return *this;}
    MInt &operator+=(const MInt &o) {x=norm(x+o.x); return *this;}
    MInt &operator-=(const MInt &o) {x=norm(x-o.x); return *this;}
    MInt &operator/=(const MInt &o) {*this *= o.inv(); return *this;}
    friend MInt operator*(const MInt &a, const MInt &b) {MInt ans=a; ans*=b; return ans;}
    friend MInt operator+(const MInt &a, const MInt &b) {MInt ans=a; ans+=b; return ans;}
    friend MInt operator-(const MInt &a, const MInt &b) {MInt ans=a; ans-=b; return ans;}
    friend MInt operator/(const MInt &a, const MInt &b) {MInt ans=a; ans/=b; return ans;}
    friend std::istream &operator>>(std::istream &is, MInt &a) {int u; is>>u; a=MInt(u); return is;}
    friend std::ostream &operator<<(std::ostream &os, const MInt &a) {os<<a.val(); return os;}
    MInt power(int b) const {int r=1, t=x; while(b){if(b&1) r=r*t%MOD; t=t*t%MOD; b/=2;} return MInt(r);}
};
using mint = MInt<1000000007>;

const int N = 100005;
mint dp[N][13];
string s;
void solve() {
    cin >> s;
    int n = s.size();
    dp[0][0] = 1;
    rep(i,0,n-1) rep(j,0,12) {
        if (s[i] == '?') {
            rep(k,0,9) {
                int u = (j * 10 + k) % 13;
                dp[i+1][u] += dp[i][j];
            }
        } else {
            int k = (j * 10 + s[i] - '0') % 13;
            dp[i+1][k] += dp[i][j];
        }
    }
    cout << dp[n][5] << "\n";
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:std,13,int,MInt,rep,个数,abc135d,dp
From: https://www.cnblogs.com/chenfy27/p/18076209

相关文章

  • 力扣刷题Days16 - 191.位1的个数(js)
    目录1,题目2,代码2.1逐位判断核心代码2.1.2逐位判断22.2位运算优化3,学习与总结1,题目编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为'1'的个数(也被称为汉明重量)。2,代码2.1逐位判断/***@param{number}n-apositivein......
  • 记录学生的姓名、编号以及总分,输入n,代表学生个数,要求用结构体泡排序将学生信息按学生
    //记录学生的姓名、编号以及总分,输入n,代表学生个数,要求用结构体,//用冒泡排序将学生信息按学生总分从低到高排名,将学生信息打印出来;//并输入一个总分x,用折半查找查找所有总分为x的学生,并将学生信息打印出来#include<stdio.h>#include<stdlib.h>structStudent{ ch......
  • L2-013 红色警报
    判断图的连通性三种做法,dfs,bfs,并查集。本题dfs。edges为可达矩阵,若i能够到达j,则edges[i][j]=1且edges[j][i]=0反之为0,因为是无向图,所以两个都要存。一开始出了点问题,我在删除那个节点之后,将edges[i][j]置为0,但是没将edges[j][i]=0,郁闷半天...#include<bits/stdc++.h>usin......
  • 13.【初三奥赛模拟测试2】
    估计也打不了多少\(qwq\)\(\Huge终于不垫底了。qwq\)初三奥赛模拟测试2T1南题解一道概率期望。一般都是从\(n\)开始递推到\(0\)。假设我们现在有\(i\)种枪,那么期望次数\[\largef_i=f_{i+1}+\fracn{n-i}\]因为当前有\(i\)种可能买到已经买过的枪,\(n-i\)......
  • 13. 罗马数字转整数c
    intromanToInt(char*s){intn=strlen(s);intc[26];c['I'-'A']=1;c['V'-'A']=5;c['X'-'A']=10;c['L'-'A']=50;c['C'-'A']=100;......
  • 卡码java基础课 | 13.链表的基础操作I
    学习内容:链表基础重点归纳:见例题例题:解:点击查看代码importjava.util.Scanner;//定义链表classLinkedList{//定义链表中的链表节点publicstaticclassNode{intdata;//数据Nodenext;//指针publicNode(intdata){/......
  • 代码随想录算法训练营第四十七天| ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家
    打家劫舍 题目链接:198.打家劫舍-力扣(LeetCode)思路:每一家的最大收益来源只有两个,一个是这家不偷,那么最大收益等于从上一家出来的最大收益,另一个是偷这一个家,因此最大收益等于从上上一家出来的最大收益加这一家的收益。classSolution{public:introb(vector<int>&nu......
  • 代码随想录算法训练营第四十七天 | 337.打家劫舍III,213.打家劫舍II ,198.打家劫舍
     198.打家劫舍 已解答中等 相关标签相关企业 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一......
  • Directory Opus 13.4 Crack
    DirectoryOpus是一个具有许多不同功能的文件管理器。该程序旨在取代Windows资源管理器,从而使文件处理更加方便并提供许多新功能。该程序提供了方便的文件管理功能,支持处理档案、访问FTP、处理图形和音乐文件。该程序具有多种设置和附加功能。DirectoryOpus和其他文件管理......
  • Django ORM 常用的13个方法
    DjangoORM常用的13个方法介绍一个可以以py脚本方式运行ORM操作的方法:可在项目内新建个py文件,复制项目内manage.py文件中的以下代码:if__name__=="__main__":os.environ.setdefault("DJANGO_SETTINGS_MODULE","ORM1.settings")importdjango#手动添加......