标签:
hdu1757:
Description
Input
Output
Sample Input
10 9999 1 1 1 1 1 1 1 1 1 1 20 500 1 0 1 0 1 0 1 0 1 0
Sample Output
45 104
求f(k);
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10;
int a[N],k,m;
struct mat {
int g[N][N];
mat operator*(mat a) {
mat tmp;
memset(tmp.g, 0, sizeof(tmp.g));
for(int i = 0; i < 10; i++) {
for(int j = 0; j < 10; j++) {
for(int k = 0; k < 10; k++) {
tmp.g[i][j] = (tmp.g[i][j] + this->g[i][k] * a.g[k][j]) % m;
}
}
}
return tmp;
}
}res,ori;
void cul(int n) {
while(n) {
if(n & 1)
res = res * ori;
n >>= 1;
ori = ori * ori;
}
printf("%d\n", res.g[0][0]);
}
int main() {
while(scanf("%d%d",&k,&m) != EOF) {
memset(res.g, 0, sizeof(res.g));
memset(ori.g, 0, sizeof(ori.g));
for(int i = 0; i < 10; i++) {
scanf("%d",&ori.g[i][0]);
res.g[0][i] = 9 - i;
}
for(int i = 0; i < 9; i++) {
ori.g[i][i + 1] = 1;
}
cul(k - 9);
}
}hdu1575
Description
Input
Output
Sample Input
2 2 2 1 0 0 1 3 99999999 1 2 3 4 5 6 7 8 9
Sample Output
2 2686
求矩阵A的k次方的对角线和(模板题)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct mat {
int g[10][10];
}res,ori;
int n,k;
mat mul(mat a, mat b) {
mat tmp;
memset(tmp.g, 0, sizeof(tmp.g));
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
tmp.g[i][j] = (tmp.g[i][j] + a.g[i][k] * b.g[k][j]) % 9973;
}
}
}
return tmp;
}
void cul(int k) {
while(k) {
if(k & 1)
res = mul(res, ori);
k >>= 1;
ori = mul(ori, ori);
}
int ans = 0;
for(int i = 0; i < n; i++) {
ans = (ans + res.g[i][i]) % 9973;
}
printf("%d\n",ans);
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&k);
memset(res.g, 0, sizeof(res.g));
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
scanf("%d",&res.g[i][j]);
}
}
ori = res;
cul(k - 1);
}
}Description

Input
Output
Sample Input
3 8 4 7 4 8
Sample Output
6 2 1
题意:一个序列只有f和m问长度为L的序列,不含fmf和fff的有几个;
思路:
结尾总共有四种
ff,fm,mf,ff
以ff结尾的再加一位,可以推出fm结尾,即ffm(不能推出ff,因为这样就有fff了)
以fm结尾能推出mm;以mm结尾能推出mm和mf;
以mm结尾的能推出mm和mf;
然后就能构造矩阵乘:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct mat {
int g[4][4];
}res, ori;
int n,m;
mat mul(mat a, mat b) {
mat tmp;
memset(tmp.g, 0, sizeof(tmp.g));
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 4; j++) {
for(int k = 0; k < 4; k++) {
tmp.g[i][j] = (tmp.g[i][j] + a.g[i][k] * b.g[k][j]) % m;
}
}
}
return tmp;
}
void cul(int k) {
while(k) {
if(k & 1)
res = mul(res, ori);
k >>= 1;
ori = mul(ori, ori);
}
int ans = 0;
for(int i = 0; i < 4; i++) {
ans = (ans + res.g[0][i]) % m;
}
printf("%d\n",ans);
}
int main() {
while(scanf("%d%d",&n,&m) != EOF) {
if(n == 0) {
printf("0\n");
continue;
}else if(n == 1) {
printf("2\n");
continue;
}else if(n == 2) {
printf("4\n");
continue;
}
memset(ori.g, 0, sizeof(ori.g));
memset(res.g, 0, sizeof(res.g));
ori.g[0][3] = 1;
ori.g[1][0] = 1;
ori.g[2][0] = 1;
ori.g[2][1] = 1;
ori.g[3][2] = 1;
ori.g[3][3] = 1;
for(int i = 0; i < 4; i++)
res.g[0][i] = 1;
cul(n - 2);
}
}#include<cstdio>
#include<cstring>
#include<cmath>
struct mat {
int g[2][2];
}res, ori;
int n;
mat mul(mat a,mat b) {
mat tmp;
memset(tmp.g, 0, sizeof(tmp.g));
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2; j++) {
for(int k = 0; k < 2; k++) {
tmp.g[i][j] = (tmp.g[i][j] + a.g[i][k] * b.g[k][j])%1024;
}
}
}
return tmp;
}
void cul(int k) {
while(k) {
if(k & 1)
res = mul(res, ori);
k >>= 1;
ori = mul(ori, ori);
}
int ans = (res.g[0][0] * 5 + res.g[0][1] * 2) %1024;
printf("%d\n",(ans * 2 - 1) % 1024);
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
if(n == 1) {
printf("9\n");
continue;
}
ori.g[0][0] = 5;
ori.g[0][1] = 12;
ori.g[1][0] = 2;
ori.g[1][1] = 5;
res = ori;
cul(n - 2);
}
} hdu2276
#include<cstdio>
#include<cstring>
#define ll long long
struct mat {
int g[105][105];
}res, ori;
int n, len;
char str[105];
char change[2] = {'1','0'};
mat mul(mat a, mat b) {
mat tmp;
memset(tmp.g, 0, sizeof(tmp.g));
for(int i = 0; i < len; i++) {
for(int j = 0; j < len; j++) {
tmp.g[0][i] = (tmp.g[0][i] + a.g[0][j] * b.g[j][i]) % 2;
}
}
return tmp;
}
mat mul2(mat a, mat b) {
mat tmp;
memset(tmp.g, 0, sizeof(tmp.g));
for(int i = 0; i < len; i++) {
for(int j = 0; j < len; j++) {
for(int k = 0; k < len; k++) {
tmp.g[i][j] = (tmp.g[i][j] + a.g[i][k] * b.g[k][j]) % 2;
}
}
}
return tmp;
}
void cul(int k){
while(k) {
if(k & 1)
res = mul(res, ori);
k >>= 1;
ori = mul2(ori, ori);
}
for(int i = 0; i <len; i++) {
printf("%d",res.g[0][i]);
}
printf("\n");
}
int main() {
while(scanf("%d",&n) != EOF) {
scanf("%s",str);
len = strlen(str);
memset(ori.g, 0, sizeof(ori.g));
memset(res.g, 0, sizeof(res.g));
for(int i = 0; i < len; i++) {
res.g[0][i] = str[i] - '0';
}
for(int i = 0; i < len; i++) {
if(i == 0)
ori.g[i][i] = ori.g[len - 1][i] = 1;
else
ori.g[i][i] = ori.g[i - 1][i] = 1;
}
cul(n);
}
}hdu4686
Description

Input
Output
Sample Input
1 1 2 3 4 5 6 2 1 2 3 4 5 6 3 1 2 3 4 5 6
Sample Output
4 134 1902
#include<cstdio>
#include<cstring>
#define ll long long
const ll mod = 1000000007;
struct mat{
ll g[5][5];
}res, ori;
mat mul(mat a, mat b) {
mat tmp;
memset(tmp.g, 0, sizeof(tmp.g));
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 5; j++) {
for(int k = 0; k < 5; k++) {
tmp.g[i][j] = (tmp.g[i][j] + a.g[i][k] * b.g[k][j])%mod;
}
}
}
return tmp;
}
void cul(ll k){
while(k) {
if(k & 1)
res = mul(res, ori);
k >>= 1;
ori = mul(ori, ori);
}
printf("%lld\n",res.g[0][0]);
}
ll a0,ax,ay;
ll b0,bx,by;
ll n;
int main() {
while(scanf("%lld",&n) != EOF) {
memset(res.g,0,sizeof(res.g));
memset(ori.g,0,sizeof(ori.g));
scanf("%lld%lld%lld%lld%lld%lld",&a0,&ax,&ay,&b0,&bx,&by);
res.g[0][1]=a0 * b0 % mod;
res.g[0][2]=a0 % mod;
res.g[0][3]=b0 % mod;
res.g[0][4]=1;
ori.g[0][0]=1;
ori.g[1][0]=1;
ori.g[1][1]=(ax * bx) % mod;
ori.g[2][1]=ax * by % mod;
ori.g[2][2]=ax % mod;
ori.g[3][1]=bx * ay % mod;
ori.g[3][3]=bx % mod;
ori.g[4][1]=ay * by % mod;
ori.g[4][2]=ay % mod;
ori.g[4][3]=by % mod;
ori.g[4][4]=1;
cul(n);
}
return 0;
} #include<cstdio>
#include<cstring>
#define ll long long
struct mat {
ll g[2][2];
}res, ori, ans;
ll n,m,k;
const ll M = 1000000007;
mat mul(mat a, mat b) {
mat tmp;
memset(tmp.g, 0, sizeof(tmp.g));
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2; j++) {
for(int k = 0; k < 2; k++) {
tmp.g[i][j] = (tmp.g[i][j] + a.g[i][k] * b.g[k][j]) % M;
}
}
}
return tmp;
}
void cul(int l){
while(l) {
if(l & 1)
res = mul(res, ori);
l >>= 1;
ori = mul(ori, ori);
}
ll sum = 0;
sum = (sum + (res.g[0][0] * (m - k) % M)) % M;
sum = (sum + (res.g[0][1] * k % M)) % M;
sum = (sum + (res.g[1][0] * (m - k) % M)) % M;
sum = (sum + (res.g[1][1] * k % M)) % M;
printf("%lld\n",sum);
}
int main() {
while(scanf("%lld%lld%lld",&n,&m,&k) != EOF) {
memset(ori.g, 0, sizeof(ori.g));
memset(res.g, 0, sizeof(res.g));
ori.g[0][0] = m-k;
ori.g[0][1] = m-k;
ori.g[1][0] = k;
ori.g[1][1] = k - 1;
res.g[0][1] = res.g[1][0] = 0;
res.g[0][0] = res.g[1][1] = 1;
cul(n - 1);
}
}#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct mat{
int g[4][4];
}res, ori;
int n;
int cas = 1;
mat mul(mat a, mat b) {
mat tmp;
memset(tmp.g, 0, sizeof(tmp.g));
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 4; j++) {
for(int k = 0; k < 4; k++) {
tmp.g[i][j] = (tmp.g[i][j] + a.g[i][k] * b.g[k][j]) % 2009;
}
}
}
return tmp;
}
mat mul2(mat a, mat b) {
mat tmp;
memset(tmp.g, 0, sizeof(tmp.g));
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 4; j++) {
tmp.g[0][i] = (tmp.g[0][i] + a.g[0][j] * b.g[j][i]) % 2009;
}
}
return tmp;
}
void cul(int k) {
while(k) {
if(k & 1)
res = mul2(res,ori);
k >>= 1;
ori = mul(ori, ori);
}
printf("Case %d: %d\n",cas++,res.g[0][3]);
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
if(n == 0) {
printf("Case %d: 1\n",cas++);
continue;
}else if(n == 1) {
printf("Case %d: 4\n",cas++);
continue;
}else if(n == 2) {
printf("Case %d: 9\n",cas++);
continue;
}
memset(res.g, 0, sizeof(res.g));
memset(ori.g, 0, sizeof(ori.g));
res.g[0][0] = 5, res.g[0][1] = 3, res.g[0][2] = 1, res.g[0][3] = 9;
ori.g[0][0] = 3, ori.g[1][0] = 2, ori.g[2][0] = 7;
ori.g[0][1] = 1, ori.g[1][2] = 1;
ori.g[0][3] = 3;
ori.g[1][3] = 2;
ori.g[2][3] = 7;
ori.g[3][3] = 1;
cul(n - 2);
}
return 0;
}#include<cstdio>
#include<cstring>
#define ll long long
struct mat {
ll g[4][4];
}res, ori, ans;
ll n,x,y;
mat mul(mat a, mat b) {
mat tmp;
memset(tmp.g, 0, sizeof(tmp.g));
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 4; j++) {
for(int k = 0; k < 4; k++) {
tmp.g[i][j] = (tmp.g[i][j] + a.g[i][k] * b.g[k][j]) % 10007;
}
}
}
return tmp;
}
void cul(ll k){
while(k) {
if(k & 1)
res = mul(res, ori);
k >>= 1;
ori = mul(ori, ori);
}
printf("%lld\n",res.g[0][0]);
}
int main() {
while(scanf("%lld%lld%lld",&n,&x,&y) != EOF) {
memset(ori.g, 0, sizeof(ori.g));
memset(res.g, 0, sizeof(res.g));
ori.g[0][0] = 1;
ori.g[1][0] = 1;
ori.g[1][1] = (x * x) % 10007;
ori.g[1][2] = 1;
ori.g[1][3] = x % 10007;
ori.g[2][1] = (y * y) % 10007;
ori.g[3][1] = (2 * x * y) % 10007;
ori.g[3][3] = y % 10007;
res.g[0][0] = 1;
res.g[0][1] = 1;
res.g[0][2] = 1;
res.g[0][3] = 1;
cul(n);
}
}#include<cstdio>
#include<cstring>
#define ll long long
struct mat {
ll g[2][2];
}res, ori;
ll a,b, m;
ll n;
mat mul(mat c, mat d) {
mat tmp;
memset(tmp.g, 0, sizeof(tmp.g));
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2; j++) {
for(int k = 0; k < 2; k++) {
tmp.g[i][j] = (tmp.g[i][j] + c.g[i][k] * d.g[k][j]) % m;
}
}
}
return tmp;
}
void cul(ll k) {
while(k) {
if(k & 1)
res = mul(res, ori);
k >>= 1;
ori = mul(ori, ori);
}
ll ans =(res.g[0][0] * 2)% m;
printf("%lld\n",ans);
}
int main() {
while(scanf("%lld%lld%lld%lld",&a,&b,&n,&m) != EOF) {
memset(ori.g, 0, sizeof(ori.g));
ori.g[0][0] = a;
ori.g[0][1] = b;
ori.g[1][0] = 1;
ori.g[1][1] = a;
res = ori;
cul(n - 1);
}
}标签:
原文地址:http://blog.csdn.net/yeyeyeguoguo/article/details/46277153