What day is that day?(快速幂,打表找周期,或者求通项公式)

有些题怎么都解不出来,这时候可以打表,找规律,求通项公式等,这些方法让人拍手叫绝,真不错……

Description

It's Saturday today, what day is it after 11 + 22 + 33 + ... + NN days?

Input

There are multiple test cases. The first line of input contains an integer T indicating the number of test cases. For each test case:

There is only one line containing one integer N (1 <= N <= 1000000000).

Output

For each test case, output one string indicating the day of week.

Sample Input

2
1
2

Sample Output

Sunday
Thursday

Hint

A week consists of Sunday, Monday, Tuesday, Wednesday, Thursday, Friday and Saturday.

source

这道题比赛的时候没做出来,因为不知道周期是什么,虽然用的快速幂,算到10^6以前很快,再大就算的很慢,题目数据为10^9, 这样早超时了,

后来看网上说打表可以找到周期294,我就把n = n % 294加到我的代码里就对了,55555~~~~~~当时我怎么不会打表,会打表的话就会ac了

主要是打表和快速幂

但是后来学长给讲了一个方法,求通项公式的方法,比打表高大上多了,其中可以边算边mod 7,但是这样的话用公式可能出现分数,因为除以一个数之后mod 7相当于乘以一个数的mod 7逆,分数问题就被解决啦,学长好厉害,下边把整个我写题的过程写出来

刚才学了下打表,大概是这样,

比如题目里有多组测试数据,第一个测试数据让你输出第1000个,那么你就可以把前1000个存起来,

如果下一组测试数据让你输出第500个的时候你就不用重新计算,而是把前面算过的第500个输出就好,

如果下一组测试让你输出第2000个,你就可以直接从1001开始算,前面算过的存储起来就不用再算了

 

令:如果题目中数据非常大的时候比如说1000000000,无法一个一个正常计算的时候,你就可以找找题中的答案是不是有规律,结果是否存在周期性,

可以通过打表把前面存的数据打出来找规律,比如试试前五百个数据间是否有规律

可以打出500个,依次改变每行的数据个数,比较首行数据是否存在规律性

#include <stdio.h>
long long fun(int x, int n)
{long pow = x, ret = 1;while(n){if(n&1)ret = ret * pow % 7;pow *= pow % 7;n /= 2;}return ret;
}
int main()
{long long n, ans, t;scanf("%lld", &t);while(t--){ans = 0;scanf("%lld",&n);n = n%294;for(int i = 1; i <= n; i++){ans += fun(i, i) % 7;ans %= 7;}switch(ans){case 1: printf("Sunday\n");break;case 2: printf("Monday\n");break;case 3: printf("Tuesday\n");break;case 4: printf("Wednesday\n");break;case 5: printf("Thursday\n");break;case 6: printf("Friday\n");break;case 0: printf("Saturday\n");break;}}return 0;
}

 这道题我打表的代码是这样的,

刚开始我不知道每行21个数据的时候每九行首行的数据就会出现周期性循环,

我先看了前30个数没有规律,然后我试了500个数据的情况下打表

从每行有15个数据开始试,试到每行21个的时候发现首行开始有规律,所以周期为21*9

#include <stdio.h>
long long fun(int x, int n)
{long pow = x, ret = 1;while(n){if(n&1)ret = ret * pow % 7;pow *= pow % 7;n /= 2;}return ret;
}
int main()
{long long n, res, ans[1000], t;scanf("%lld", &t);while(t--){res = 0;scanf("%lld",&n);for(int i = 1; i <= n; i++){res += fun(i, i) % 7;res %= 7;ans[i] = res;}for(int i = 1; i <= n; i++){if((i-1) % 21 == 0)printf("\n");switch(ans[i]){case 1: printf("7 ");break;case 2: printf("1 ");break;case 3: printf("2 ");break;case 4: printf("3 ");break;case 5: printf("4 ");break;case 6: printf("5 ");break;case 0: printf("6 ");break;}}printf("\n\n");}return 0;
}

 3达标找周期的方法太笨了,还是学长给讲的求通项公式的方法好用,高端大气方便

但是我写这东西的时候掉进一个陷阱里了,怎么都找不出错误,差点就放弃了,因为真的是让姐花了几个小时去找啊~~~~~~~~~~~~~

求mod 7逆的时候要求逆的数必须是正数,如果是负数就一直加7直到这个数变成正数,然后求逆,………………坑啊,忘了这个,负数就直接求逆了,浪费好几个小时……

这样写思路大概就是

(1^1 + 2^2 + 3 ^ 3 + 4 ^4 + …… + n ^ n ) % 7 =

1^1 + 2^2 + 3^3 + 4^4 + 5^5 + 6^6 + (7%7)^7 + 

1^8 + 2^9 + 3^10 + 4^11 + 5 ^12 + 6^13 + 0^14+

……

因为最终结果要mod 7所以每个数可以先mod 7然后再加起来所以就可以算通项公式

1^1 + 1^8 + 1^15 + …… = n

2^2 + 2^9 + 2^16 + …… = Qfact(2, 2) * (1 - Qfact(2, 7*n)) / mod7ni(1 - Qfact(2, 7))

3^3 + 2^10 + 3^17+……= Qfact(3,3)*(1 - Qfact(3, 7*n)/ mod7ni(1 - Qfact(3, 7))

……

以此类推,其中一定要注意负数的mod 7逆一定要把这个数变成正数要求逆,不然就悲剧了啊啊啊啊啊啊啊啊……

#include <stdio.h>
#define __int64 long long
void exGcd(__int64 a, __int64 b, __int64 &x, __int64 &y)
{if(b == 0){x = 1;y = 0;return ;}else{exGcd(b, a % b, x, y);int t = x;x = y;y = t - a / b * y;}
}
__int64 Qfact(__int64 x, __int64 n)
{__int64 ret = 1, pow = x;while(n){if(n&1)ret = ret * pow % 7;pow = pow * pow % 7;n /= 2;}return ret;
}
__int64 mod7ni(__int64 n)
{__int64 x, y;while(n < 0) n += 7;exGcd(n, 7, x, y);return (x% 7 - 7) % 7;
}
int main()
{__int64 t, ans;scanf("%I64d", &t);while(t--){__int64 n, tmp1, tmp2;scanf("%I64d", &n);tmp1 = n / 7;tmp2 = n % 7;ans = tmp1;if(tmp1){for(int i = 2; i < 7; i++){ans = ans + Qfact(i, i) * (1 - Qfact(i, 7 * tmp1)) * mod7ni(1 - Qfact(i, 7)) % 7;ans = (ans % 7 + 7) % 7;}}if(tmp2){for(int i = 1; i <= tmp2; i++){ans = ans + Qfact(i, 7 * tmp1 + i) % 7;ans = (ans % 7 + 7) % 7;}}ans = (ans % 7 + 7) % 7;switch(ans){case  1: printf("Sunday\n");break;case  2: printf("Monday\n");break;case  3: printf("Tuesday\n");break;case  4: printf("Wednesday\n");break;case  5: printf("Thursday\n");break;case  6: printf("Friday\n");break;case  0: printf("Saturday\n");break;}}return 0;
}

 

转载于:https://www.cnblogs.com/rain-1/p/4761548.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql中数据定义语言_SQL数据定义语言(DDL)

数据库模式定义语言DDL(DataDefinition Language)&#xff0c;是用于描述数据库中要存储的现实世界实体的语言。一个数据库模式包含该数据库中所有实体的描述定义。这些定义包括结构定义、操作方法定义等。DDL描述的模式&#xff0c;必须由计算机软件进行编译&#xff0c;转换为…

瞎搞

declare a int,b int,c int set a (select top 1 a from Table_1 ) set b (select top 1 b from Table_1 ) set c (select top 1 c from Table_1 ) if(a>b and a>c) beginprint(a的值最大)endif(b>a and b>c) beginprint(b的值最大)endif(c>a and c>b) be…

db2 脚本运行错误返回错误原因_电脑运行错误代码大全,遇到报错请自己对照断电原因所在吧...

电脑在运行的时候&#xff0c;会出现一些代码&#xff0c;软件安装不上啊或电脑使用中蓝屏啊出现的代码&#xff0c;每一次出现问题电脑都会以代码的形式反馈&#xff0c;我们就可以凭借错误代码来判断故障源。小编整理了一些常出现的错误代码和问题分享给大家&#xff0c;希望…

LeetCode 2028. 找出缺失的观测数据

文章目录1. 题目2. 解题1. 题目 现有一份 n m 次投掷单个 六面 骰子的观测数据&#xff0c;骰子的每个面从 1 到 6 编号。 观测数据中缺失了 n 份&#xff0c;你手上只拿到剩余 m 次投掷的数据。 幸好你有之前计算过的这 n m 次投掷数据的 平均值 。 给你一个长度为 m 的整…

Sqlite学习笔记(五)SQLite封锁机制

概述 SQLite虽然是一个轻量的嵌入式数据库&#xff0c;但这并不影响它支持事务。所谓支持事务&#xff0c;即需要在并发环境下&#xff0c;保持事务的ACID特性。事务的原子性&#xff0c;隔离性都需要通过并发控制来保证。那么Sqlite的并发控制是怎样的&#xff0c;如何实现&am…

idea中git如何切换到master_IDEA中Git的使用

原文转载于&#xff1a;https://www.cnblogs.com/javabg/p/8567790.html工作中多人使用版本控制软件协作开发&#xff0c;常见的应用场景归纳如下&#xff1a;假设小组中有两个人&#xff0c;组长小张&#xff0c;组员小袁场景一&#xff1a;小张创建项目并提交到远程Git仓库场…

LeetCode 2032. 至少在两个数组中出现的值(哈希/位运算)

文章目录1. 题目2. 解题2.1 哈希查找2.2 位运算1. 题目 给你三个整数数组 nums1、nums2 和 nums3 &#xff0c;请你构造并返回一个 不同 数组&#xff0c;且由 至少 在 两个 数组中出现的所有值组成。 数组中的元素可以按 任意 顺序排列。 示例 1&#xff1a; 输入&#xff1…

Nginx反向代理配置配置实例

为了节省支出&#xff0c;公司需要将分布在不同机器的站点都迁移到一台机器&#xff0c;而目前不同机器运行的是不同的web服务&#xff0c;部分是nginx&#xff0c;部分是apache&#xff0c;由于牵涉较多rewrite规则&#xff0c;为了节省修改功夫&#xff0c;打算迁移后相应站点…

python装饰器由浅入深_由浅入深理解Python装饰器

前提知识&#xff1a;1、Python里函数也是一种对象&#xff1a;def shout(word"yes"):return word.capitalize()"!"print shout()# outputs : Yes!# As an object, you can assign the function to a variable like any# other objectscream shout# Notic…

LeetCode 2033. 获取单值网格的最小操作数(贪心)

文章目录1. 题目2. 解题1. 题目 给你一个大小为 m x n 的二维整数网格 grid 和一个整数 x 。 每一次操作&#xff0c;你可以对 grid 中的任一元素 加 x 或 减 x 。 单值网格 是全部元素都相等的网格。 返回使网格化为单值网格所需的 最小 操作数。如果不能&#xff0c;返回 …

WCF X.509验证

1.证书的制作 makecert.exe -sr LocalMachine -ss My -a sha1 -n CNParkingServer -sky exchange -pe makecert.exe -sr LocalMachine -ss My -a sha1 -n CNParkingClient -sky exchange -pe 注意&#xff1a;证书制作完后还要对相应的证书读取权限作配置。 WCF取用X.509证书&…

mysql最左_Mysql最左原则

1. 前言偶然看到一个技术群&#xff0c;对一道关于联合索引的讨论。面试题如下&#xff1a;a_b_c_index 三列复合索引 a 1 and b<100 and c5 这个查询 会用到索引的那几部分&#xff1f;复制代码先说下个人经过本人查询多方资料得到的结论&#xff0c; 只会用到 a 和 b部分(…

LeetCode 2034. 股票价格波动(set + map)

文章目录1. 题目2. 解题1. 题目 给你一支股票价格的数据流。数据流中每一条记录包含一个 时间戳 和该时间点股票对应的 价格 。 不巧的是&#xff0c;由于股票市场内在的波动性&#xff0c;股票价格记录可能不是按时间顺序到来的。 某些情况下&#xff0c;有的记录可能是错的…

Yslow-23条规则

YslowYahoo发布的一款基于FireFox的插件,主要是为了提高网页性能而设计的&#xff0c;下面是它提倡了23条规则&#xff0c;还是很不错的&#xff0c;分享一下&#xff1a; 1.减少HTTP请求次数合并图片、CSS、JS&#xff0c;改进首次访问用户等待时间。2. 使用CDN就近缓存>智…

什么是python函数_什么是python函数

python函数是指组织好的、可重复使用的、用来实现单一或相关联功能的代码段。python函数包含系统中自带的一些函数、第三方函数、以及用户自定义的函数。函数是可以实现一些特定功能的小方法或是小程序。在Python中有很多内建函数&#xff0c;当然随着学习的深入&#xff0c;我…

LeetCode 2035. 将数组分成两个数组并最小化数组和的差(状态压缩DP)

文章目录1. 题目2. 解题1. 题目 给你一个长度为 2 * n 的整数数组。 你需要将 nums 分成 两个 长度为 n 的数组&#xff0c;分别求出两个数组的和&#xff0c;并 最小化 两个数组和之 差的绝对值 。 nums 中每个元素都需要放入两个数组之一。 请你返回 最小 的 数组和之差。 …

linux for循环

一定要记得写后面的分号&#xff1b;http://www.runoob.com/linux/linux-shell-variable.html 这个页面的课程的循环教程是有问题的 for color in yellow green white;do   echo ${color}done 利用循环列出某个目录下的<b>所有</b>文件 for line in ls /tmp/yang…

Visual Studio Code C++配置文件

文章目录tasks.jsonlaunch.jsonc_cpp_properties.json以下三个文件放在 项目下 .vscode 文件夹中&#xff0c;内容从网络收集&#xff0c;经自己实践添加修改以备忘 tasks.json {// See https://go.microsoft.com/fwlink/?LinkId733558// for the documentation about the t…

南通大学python期末考试试卷答案_南通大学2015-2016年1学期《软工》作业点评总结...

第一次作业(2015.9.13)作业题目存在问题1.学生可能平时写博客的机会比较少&#xff0c;书写格式存在的问题比较多。比如文字排版、博客中的代码直接粘贴(没有使用代码样式)、插入的图片太大等等。这些问题老师在上课的时候可以专门抽出一节课的时间跟学生讲一下&#xff0c;计算…

android--仿网易新闻主界面

主要是学习ActionBarDrawerLayoutActionBarDrawerToggle,很不错的教程,下面一步一步带你实现这个过程,有不足之处欢迎留言交流.下面先来一张效果图 根据图片分析,要实现的有侧边栏DrawerLayout,ActionBar的颜色和菜单以及ActionBarDrawerToggle的动画效果. 在这之前,Theme要改…