hdu5564 Clarke and digits
Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 144    Accepted Submission(s): 84
He wants to know the number of positive integers which have a length in [l,r] and
are divisible by 7 and
the sum of any adjacent digits can not be k.
the number of the test cases.
Each test case contains three integers l,r,k(1≤l≤r≤109,0≤k≤18).
1 2 5
2 3 5
125
Hint:
At the first sample there are 13 number $7,21,28,35,42,49,56,63,70,77,84,91,98$ satisfied.
这题先列出dp方程,dp[i][x][ (t*10+x)%7 ]+=dp[i-1][j][t],因为i太大,所以要用矩阵快速幂加速。
可以构造矩阵【dp[i][0][0],dp[i][1][0],..dp[i][0][6],...dp[i][9][6],sum[i-1] 】*A=【dp[i+1][0][0],dp[i+1][1][0],..dp[i+1][0][6],...dp[i+1][9][6],sum[i]】,其中dp[i][j][k]中j表示的是最后一位的数,k表示的是这个数模7后的余数,为了表示前缀和,我们只要把第71列的前10个变为1,dp[70][70]变为1就行了。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
#define inf 99999999
#define pi acos(-1.0)
#define MOD 1000000007
struct matrix{
    ll n,m,i;
    ll data[72][72];
    void init_danwei(){
        for(i=0;i<n;i++){
            data[i][i]=1;
        }
    }
};
matrix multi(matrix &a,matrix &b){
    ll i,j,k;
    matrix temp;
    temp.n=a.n;
    temp.m=b.m;
    for(i=0;i<temp.n;i++){
        for(j=0;j<temp.m;j++){
            temp.data[i][j]=0;
        }
    }
    for(i=0;i<a.n;i++){
        for(k=0;k<a.m;k++){
            if(a.data[i][k]>0){
                for(j=0;j<b.m;j++){
                    temp.data[i][j]=(temp.data[i][j]+(a.data[i][k]*b.data[k][j])%MOD )%MOD;
                }
            }
        }
    }
    return temp;
}
matrix fast_mod(matrix &a,ll n){
    matrix ans;
    ans.n=a.n;
    ans.m=a.m;
    memset(ans.data,0,sizeof(ans.data));
    ans.init_danwei();
    while(n>0){
        if(n&1)ans=multi(ans,a);
        a=multi(a,a);
        n>>=1;
    }
    return ans;
}
int main()
{
    ll n,k,m,i,j,T,l,r,t,x;
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%lld%lld%lld",&l,&r,&k);
        matrix a;
        a.n=a.m=71;
        memset(a.data,0,sizeof(a.data));
        for(t=0;t<=6;t++){
            for(j=0;j<=9;j++){
                for(x=0;x<=9;x++){
                    if(x+j!=k){
                        a.data[j+10*t  ][x+(t*10+x)%7*10  ]=1;
                    }
                }
            }
        }
        for(i=0;i<10;i++){
            a.data[i][70]=1;
        }
        a.data[70][70]=1;
        matrix a1;
        a1.n=a1.m=71;
        memset(a1.data,0,sizeof(a1.data));
        for(i=0;i<=70;i++){
            for(j=0;j<=70;j++){
                a1.data[i][j]=a.data[i][j];
            }
        }
        matrix b;
        b.n=1;b.m=71;
        memset(b.data,0,sizeof(b.data));
        for(j=1;j<=9;j++){
            b.data[0][j+j%7*10]=1;
        }
        matrix b1;
        b1.n=1;b1.m=71;
        memset(b1.data,0,sizeof(b1.data));
        for(j=1;j<=9;j++){
            b1.data[0][j+j%7*10]=1;
        }
        ll sum1,sum2;
        matrix ans;
        ans=fast_mod(a,l-1);
        matrix cnt;
        cnt=multi(b,ans);
        sum1=cnt.data[0][70];
        matrix ans1;
        ans1=fast_mod(a1,r);
        /*
        for(i=0;i<=70;i++){
            for(j=0;j<=70;j++){
                printf("%lld ",ans1.data[i][j]);
            }
            printf("\n");
        }
        */
        matrix cnt1;
        cnt1=multi(b1,ans1);
        sum2=cnt1.data[0][70];
        printf("%lld\n",(sum2-sum1+MOD)%MOD );
    }
    return 0;
}
hdu5564 Clarke and digits的更多相关文章
- hdu 5564 Clarke and digits 矩阵快速幂优化数位dp
		Clarke and digits Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ... 
- HDU 5564:Clarke and digits 收获颇多的矩阵快速幂 + 前缀和
		Clarke and digits Accepts: 16 Submissions: 29 Time Limit: 5000/3000 MS (Java/Others) Memory Limi ... 
- HDU 5564 Clarke and digits 状压dp+矩阵加速
		题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5564 题意: 求长度在[L,R]范围,并且能整除7的整数的总数. 题解: 考虑最原始的想法: dp[ ... 
- 【HDOJ】5564 Clarke and digits
		DP+快速矩阵幂.注意base矩阵的初始化,不难. /* 5564 */ #include <iostream> #include <string> #include < ... 
- hdu  5564 Clarke and digits
		题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5564 ------------------------------------------------ ... 
- hdu5564--Clarke and digits(数位dp+矩阵快速幂)
		Clarke and digits 问题描述 克拉克是一名人格分裂患者.某一天,克拉克变成了一个研究人员,在研究数字. 他想知道在所有长度在[l,r]之间的能被7整除且相邻数位之和不为k的正整数有多少 ... 
- [LeetCode] Reconstruct Original Digits from English 从英文中重建数字
		Given a non-empty string containing an out-of-order English representation of digits 0-9, output the ... 
- [LeetCode] Remove K Digits 去掉K位数字
		Given a non-negative integer num represented as a string, remove k digits from the number so that th ... 
- [LeetCode] Count Numbers with Unique Digits 计算各位不相同的数字个数
		Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ... 
随机推荐
- dotnet高性能buffer
			1 前言 我曾经写过<杂谈.netcore的Buffer相关新类型>的博客,简单介绍过BinaryPrimitives.Span<>,Memory<>,ArrayP ... 
- 【EXP】Oracle多表导出问题
			有些时候,需要导入某个用户的一些相关表.但是不知道用户的用户名和密码.这样就很尴尬 但是如果手上有dba权限的用户的话,就很方便的能导出了 先要知道多表导出的语句 exp system/123456 ... 
- 【Oracle】常见等待事件处理
			1.查看数据库中需要关注的等待事件: select sw.seq#,sw.sid||','||s.serial# sids,s.username,sw.event,sw.P1,sw.p2,sw.p3, ... 
- [Usaco2008 Mar]River Crossing渡河问题
			题目描述 Farmer John以及他的N(1 <= N <= 2,500)头奶牛打算过一条河,但他们所有的渡河工具,仅仅是一个木筏. 由于奶牛不会划船,在整个渡河过程中,FJ必须始终在木 ... 
- 第2章_神经网络入门_2-5&2-6 数据处理与模型图构建
			目录 神经元的TF实现 安装 神经网络的TF实现 神经元的TF实现 安装 版本: Python 2.7 tf 1.8.0 Linux 略 demo 神经网络的TF实现 # py36 tf 2.1. # ... 
- 超微服务器重置ipmi登录密码
			超微服务器的ipmi登录密码不对,需要重置但是bios内并没有找到可以设置的选项. 以下是解决办法: 安装IPMITOOLyum install ipmitool -y 执行以下命令加载模块:modp ... 
- 抓包一张tcpdump小抄就够了
			作者简介 李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络等. ... 
- JAVA高并发集合详解
			Queue(队列)主要是为了高并发准备的容器Deque:双端队列,可以反方向装或者取 最开始jdk1.0只有Vector和hashtable 默认所有方法都实现了synchronized锁,线程安全但 ... 
- udp 连接
			在今天的内容里,我对 UDP 套接字调用 connect 方法进行了深入的分析.之所以对 UDP 使用 connect,绑定本地地址和端口,是为了让我们的程序可以快速获取异步错误信息的通知,同时也可以 ... 
- Python学习【第4篇】:元组魔法
			template = "i am {name},age:{age}" v = template.format(**{"name":'xiaoxing',&quo ... 
