L The Digits String(没有写完,有空补)
链接:https://ac.nowcoder.com/acm/contest/338/L
来源:牛客网
Consider digits strings with length n, how many different strings have the sum of digits are multiple of 4?
输入描述:
There are several test cases end with EOF. For each test case, there is an integer in one line: n, the length of the digits string. (1≤n≤1,000,000,000).
输出描述:
For each case, output the number of digits strings with length n have the sum of digits are multiple of 4 in one line. The numbers maybe very large, you should output the result modular 2019.
输出
3
25
249
479
题目大意
• 求长度为n的数字串中,有多少个这样数字串,其数字
之和是4的倍数(包括0)
• 输入:每组测试数据一行,包含一个正整数n( ≤ c≤ )
• 输出:对于每组测试数据,输出一行,包含一个整数, 表示有多少个这样数字串,其数字之和是4的倍数(包 括0)。因为这个结果很大,所以将值模2019输出 • 本题快速幂,复杂度为O(logn)。标程在1000组测试 数据下的运行时间约为60毫秒(第二标程运行时间约 30毫秒)。建议时间限制为1秒,空间限制为64M。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cfloat>
#include <climits>
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <bitset>
using namespace std; #define LL long long
const int matrix_size = 4;
const int MOD = 2019; int add(int a, int b)
{
a += b;
if(a >= MOD)
{
return a - MOD;
}
return a;
} struct Matrix
{
int size;
int num[matrix_size][matrix_size]; void operator=(const Matrix &m)
{
for(int i = 0; i < size; ++i)
{
memcpy(num[i], m.num[i], sizeof(int) * size);
}
} void Init()
{
for(int i = 0; i < size; ++i)
{
memset(num[i], 0, sizeof(int) * size);
num[i][i] = 1;
}
} void Set()
{
size = 4;
memset(num, 0, sizeof(num));
for(int j = 0; j < 4; ++j)
{
for(int i = 0; i < 10; ++i)
{
++num[(j + i) % 4][j];
}
}
} void operator*=(const Matrix &m)
{
static Matrix ans;
ans.size = size;
for(int i = 0; i < size; ++i)
{
for(int j = 0; j < size; ++j)
{
ans.num[i][j] = 0;
for(int k = 0; k < size; ++k)
{
ans.num[i][j] = add(ans.num[i][j], (LL)num[i][k] * m.num[k][j] % MOD);
}
}
}
(*this) = ans;
} void fast_pow(LL n)
{
static Matrix ans;
ans.size = size;
for(ans.Init(); n != 0; n >>= 1)
{
if((n & 1) == 1)
{
ans *= (*this);
}
(*this) *= (*this);
}
(*this) = ans;
}
}; int n;
Matrix m; int main()
{
#ifdef Dmaxiya
freopen("test.txt", "r", stdin);
#endif // Dmaxiya
ios::sync_with_stdio(false); while(scanf("%d", &n) != EOF)
{
m.Set();
m.fast_pow(n);
printf("%d\n", m.num[0][0]);
} return 0;
}
标答
•#include <stdio.h>
•#define M 2019
•#define L 4
•#define LP(i) for(i=0;i<L;++i)
•void Product(int x[L][L],int y[L][L],int z[L][L]){
• int i,j,k,w[L][L]={};
• LP(i)LP(j)LP(k)w[i][j]=(w[i][j]+x[i][k]*y[k][j])%M;
• LP(i)LP(j)z[i][j]=w[i][j];}
•
•void FPow(int n,int r[L][L]){
• int i,j,A[L][L]={{,,,},{,,,},{,,,},{,,,}};
• LP(i)LP(j)r[i][j]=i==j?:;
•while(n){
•if(n&)Product(r,A,r);
•Product(A,A,A);
• n>>=;}}
•int cal(int n){
•int r[L][L];
•FPow(n,r);
• return (*r[][]+*r[][]+*r[][]+*r[][])%M;}
•
•int main(){
•int n;
•while(scanf("%d",&n)!=EOF&&n>)
•printf("%d\n",cal(n-));
•return ;}
解题思路(续)
• 矩阵
•
•
•
•
• 有四个特征根,分别是0,,+i,-i;
• 所以an=x10n+ycos(nπ/)+zsin(nπ/),根据
a1=,a2=,a3=,可得:
• an=(10n+2sqrt()ncos(nπ/))/;
• 同样快速幂求得答案。
•#include <stdio.h>
•#define M 2019
• int rt[][],et[]={,,,-,-,-,,};
•int FPow(int f,int n){
• int r=,m=;
•while(n){
• if(n&)r=(r*rt[f][m])%M;
• m++;
• n>>=;}
•return r;}
•
•int cal(int n){
•int r1,r2;
• r1=FPow(,n);
• r2=((FPow(,n/)*et[n%])%M+M)%M;
• return ((r1+r2)*)%M;
• }
•int main(){
•int n,i;
• rt[][]=;rt[][]=;
• for(i=;i<;++i){
• rt[][i]=(rt[][i-]*rt[][i-])%M;
• rt[][i]=(rt[][i-]*rt[][i-])%M;}
•while(scanf("%d",&n)!=EOF&&n>)
•printf("%d\n",cal(n));
•return ;}
STZG的代码
L The Digits String(没有写完,有空补)的更多相关文章
- HDU 4640 状态压缩DP 未写完
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...
- 不写完不让回家的JQuery的事件与动画
在这看不见太阳的小黑屋里,苦逼的一天又开始了 好了闲话我也就不扯了,接下来我就来说说我对jQuery事件和动画的理解吧!!! 还是得再扯两句,我们敬爱的,Y老师讲完了,jQuery事件和动画,对着我们 ...
- 刚写完的商城erp + 这个商城前台,新鲜出炉。自己1个人写, 包括php框架和前端html页面.
刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面. 刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面.
- Scrum:The Definition of Done —— 作业有没有写完呢?
Scrum:The Definition of Done -- 作业有没有写完呢?_苗得雨_新浪博客 http://blog.sina.com.cn/s/blog_59450ffc0102eiai.h ...
- 用putty玩linux的时候由于以前用window 习惯写完东西按一下ctrl+s 保存
问题描述:用putty玩linux的时候由于以前用window 习惯写完东西按一下ctrl+s 保存,但是在putty一按下就不能再输入了.后来查找到:ctrl+s 是putty的一个命令大概是这样子 ...
- Word 双栏排版最后多一页空白页删不掉、左栏文字没写完就到右栏了
1. 问题 问题:Word双栏排版,最后多一页空白页,删不掉.如图: 原因分析:删不掉是因为末尾文字处其实有个下一页分节符,只不过可能看不到. 如何清晰的看到? 视图 > 大纲,就可以看到了.如 ...
- String的源码理解(未写完)
String本质上是一个char数组(jdk 9之后是byte数组),并且是一个声明为final的数组,并且String的不可变也是通过这种把数组声明为final来实现的 public final c ...
- QBXT Day2主要是数据结构(没写完先占坑)
简单数据结构 本节课可能用到的一些复杂度: O(log n). 1/1+1/1/.....1/N+O(n log n) 在我们初学OI的时候,总会遇到这么一道题. 给出N次操作,每次加入一个数,或者询 ...
- 写完代码就去吃饺子|The 10th Henan Polytechnic University Programming Contest
河南理工大学第十届校赛 很久没有组队打比赛了,好吧应该说很久没有写题了, 三个人一起玩果然比一个人玩有趣多了... 前100分钟过了4题,中途挂机100分钟也不知道什么原因,可能是因为到饭点太饿了?, ...
随机推荐
- CentOS6.5系统解决中文乱码问题
一. 问题详情 Windows的默认编码为GBK,Linux的默认编码为UTF-8.在Windows下编辑的中文,在Linux下显示为乱码.为了解决此问题,修改Linux的默认编码为GBK. ...
- this与super的区别
调用super()的语句必须要写在子类构造方法的第一行. super()是在子类中调用父类的构造方法:this()是在同一类中调用其它方法. super()和this()都需要放在构造函数的第一行. ...
- [NOI1999]生日蛋糕(搜索)
[NOI1999]生日蛋糕 题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半 ...
- 2018-10-01-weekly
Algorithm 77. 组合 What 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. How 利用递归的思想,当凑够k个数时,就回退回去,remove掉一个数,在 ...
- 揭示编译器API
编译器管道功能区 .NET编译器平台(“Roslyn”)通过提供一个API层,是一个传统编译器管道镜像,向你这样的消费者揭示了C#和Visual Basic编译器的代码分析. 这条管道的每一部分,现在 ...
- thinkphp 关联
原理:https://www.kancloud.cn/laowu199/e_dev/448632 示例数据库 hasOne:有一个,加上主谓语应该是 ,A 有一个 BhasMany:有很多,A 有很多 ...
- python高级:垃圾回收机制
---恢复内容开始--- 垃圾回收机制 1.计数引用机制 就是一个变量.数据结构.对象当没有人引用时,python的会启用垃圾回收机制,将其从内存中删除. 怎么看引用的次数呢?sys模块提供的sys. ...
- 对getBoundingClientRect属性的研究
1.getBoundingClientRect用于获取某个元素相对于视窗的位置集合.集合中有top, right, bottom, left等属性. .top:元素上边到视窗上边的距离; right: ...
- 18 StringBuilder类型有何作用
- python学习笔记(十六)python操作redis数据库
Redis是一个key-value存储系统,它支持丰富的数据类型,如:string.list.set.zset(sorted set).hash. Redis特点 Redis以内存作为数据存储介质,所 ...