hdu 5564 快速矩阵幂+数位dp
2015-12-10 20:42
267 查看
hdu5564
这道题一看就知道用数位dp,但是在状态转移时,发现不可能转移成功,10^9,但是发现转移可以用矩阵来进行表示,因此……
但是要注意矩阵最后一列用来计算结果。代码看看就好了,毕竟卡着时间过的,2500ms左右,标程3000ms.
//hdu 5564 快速矩阵幂+数位dp
#include<stdio.h>
#include<cstdlib>
#include<istream>
#define mod 1000000007
#define long long ll
using namespace std;
struct Mat
{
int on[72][72];
void init()
{
int i, j;
for (i = 0;i <= 71;i++)
for (j = 0;j <= 71;j++)
this->on[i][j] = 0;
}
friend Mat operator*(Mat a, Mat b);
friend Mat operator^(Mat a, int n);
};
Mat operator*(Mat a, Mat b)
{
Mat res;
res.init();
int i, j, l;
for (i = 0;i <= 70;i++)
for (j = 0;j <= 70;j++)
for (l = 0;l <= 70;l++)
{
res.on[i][j] = (res.on[i][j] +(1ll*a.on[i][l]*b.on[l][j])%mod) % mod;
}
return res;
}
Mat operator^(Mat a, int n)
{
Mat b;
b.init();
int i;
for (i = 0;i <= 70;i++)
b.on[i][i] = 1;
while (n)
{
if (n % 2)
{
b = b*a;
}
a = a*a;
n = n / 2;
}
return b;
}
int main()
{
int T;
//freopen("d:\\in.txt", "r", stdin);
scanf("%d", &T);
while (T--)
{
int l, r, k;
scanf("%d%d%d", &l, &r, &k);
Mat a,b;
a.init();
b.init();
int i,j,t;
for (i = 1;i <= 9;i++)
a.on[0][i%7*10+i] = 1;
for (i = 0;i <= 6;i++)
for (j = 0;j <= 9;j++)
for (t = 0;t <= 9;t++)
{
if ((j + t) != k)
b.on[i*10+j][(i*10+t)%7*10+t] = 1;
}
for (i = 0;i <= 9;i++)
b.on[i][70] = 1;
b.on[70][70] = 1;
Mat a1, a2;
a1.init();
a2.init();
a1 = a*(b ^ (l - 1));
a2 = a*(b^r);
printf("%d\n", (a2.on[0][70] - a1.on[0][70]+mod)%mod);
}
return 0;
}
这道题一看就知道用数位dp,但是在状态转移时,发现不可能转移成功,10^9,但是发现转移可以用矩阵来进行表示,因此……
但是要注意矩阵最后一列用来计算结果。代码看看就好了,毕竟卡着时间过的,2500ms左右,标程3000ms.
//hdu 5564 快速矩阵幂+数位dp
#include<stdio.h>
#include<cstdlib>
#include<istream>
#define mod 1000000007
#define long long ll
using namespace std;
struct Mat
{
int on[72][72];
void init()
{
int i, j;
for (i = 0;i <= 71;i++)
for (j = 0;j <= 71;j++)
this->on[i][j] = 0;
}
friend Mat operator*(Mat a, Mat b);
friend Mat operator^(Mat a, int n);
};
Mat operator*(Mat a, Mat b)
{
Mat res;
res.init();
int i, j, l;
for (i = 0;i <= 70;i++)
for (j = 0;j <= 70;j++)
for (l = 0;l <= 70;l++)
{
res.on[i][j] = (res.on[i][j] +(1ll*a.on[i][l]*b.on[l][j])%mod) % mod;
}
return res;
}
Mat operator^(Mat a, int n)
{
Mat b;
b.init();
int i;
for (i = 0;i <= 70;i++)
b.on[i][i] = 1;
while (n)
{
if (n % 2)
{
b = b*a;
}
a = a*a;
n = n / 2;
}
return b;
}
int main()
{
int T;
//freopen("d:\\in.txt", "r", stdin);
scanf("%d", &T);
while (T--)
{
int l, r, k;
scanf("%d%d%d", &l, &r, &k);
Mat a,b;
a.init();
b.init();
int i,j,t;
for (i = 1;i <= 9;i++)
a.on[0][i%7*10+i] = 1;
for (i = 0;i <= 6;i++)
for (j = 0;j <= 9;j++)
for (t = 0;t <= 9;t++)
{
if ((j + t) != k)
b.on[i*10+j][(i*10+t)%7*10+t] = 1;
}
for (i = 0;i <= 9;i++)
b.on[i][70] = 1;
b.on[70][70] = 1;
Mat a1, a2;
a1.init();
a2.init();
a1 = a*(b ^ (l - 1));
a2 = a*(b^r);
printf("%d\n", (a2.on[0][70] - a1.on[0][70]+mod)%mod);
}
return 0;
}
相关文章推荐
- Poj1681 【枚举】
- PHP入门-配置虚拟主机
- [Windows]_[0基础]_[使用命令行工具dumpbin分析文件]
- [UIWebView Error]App Transport Security has blocked a cleartext
- IIS 7.5关闭.net程序DEBUG
- Leetcode题解(十)
- GridView的使用
- E-R模型简介
- MMO近期经验总结
- java基础
- 2015年大二上-数据结构-数组与广义表(1)-猴子选大王(数组版)
- 关于css,js,jQurey的外部引用
- 内存泄漏弄个明白
- Python之open()函数详解
- 搜索Oil Deposits
- STL训练(12.10.15~12.13.15)
- C++ using关键字作用总结
- 求40+的阶乘
- #学习笔记#(11)四分圆环-photoshop
- 【2011图灵奖得主】我眼中的Judea Pearl