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

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 = ;
while(n)
{
if(n&)
ret = ret * pow % ;
pow *= pow % ;
n /= ;
}
return ret;
}
int main()
{
long long n, ans, t;
scanf("%lld", &t);
while(t--)
{
ans = ;
scanf("%lld",&n);
n = n%;
for(int i = ; i <= n; i++)
{
ans += fun(i, i) % ;
ans %= ;
}
switch(ans)
{
case : printf("Sunday\n");break;
case : printf("Monday\n");break;
case : printf("Tuesday\n");break;
case : printf("Wednesday\n");break;
case : printf("Thursday\n");break;
case : printf("Friday\n");break;
case : printf("Saturday\n");break;
}
}
return ;
}

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

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

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

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

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

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 == )
{
x = ;
y = ;
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 = , pow = x;
while(n)
{
if(n&)
ret = ret * pow % ;
pow = pow * pow % ;
n /= ;
}
return ret;
}
__int64 mod7ni(__int64 n)
{
__int64 x, y;
while(n < ) n += ;
exGcd(n, , x, y);
return (x% - ) % ;
}
int main()
{
__int64 t, ans;
scanf("%I64d", &t);
while(t--)
{
__int64 n, tmp1, tmp2;
scanf("%I64d", &n);
tmp1 = n / ;
tmp2 = n % ;
ans = tmp1;
if(tmp1)
{
for(int i = ; i < ; i++)
{
ans = ans + Qfact(i, i) * ( - Qfact(i, * tmp1)) * mod7ni( - Qfact(i, )) % ;
ans = (ans % + ) % ;
}
}
if(tmp2)
{
for(int i = ; i <= tmp2; i++)
{
ans = ans + Qfact(i, * tmp1 + i) % ;
ans = (ans % + ) % ; }
}
ans = (ans % + ) % ;
switch(ans)
{
case : printf("Sunday\n");break;
case : printf("Monday\n");break;
case : printf("Tuesday\n");break;
case : printf("Wednesday\n");break;
case : printf("Thursday\n");break;
case : printf("Friday\n");break;
case : printf("Saturday\n");break;
}
} return ;
}

What day is that day?(快速幂,打表找周期,或者求通项公式)的更多相关文章

  1. Nowcoder 练习赛 17 C 操作数 ( k次前缀和、矩阵快速幂打表找规律、组合数 )

    题目链接 题意 :  给定长度为n的数组a,定义一次操作为: 1. 算出长度为n的数组s,使得si= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007: 2. ...

  2. Nowcoder 北师校赛 B 外挂使用拒绝 ( k次前缀和、矩阵快速幂打表找规律、组合数 )

    题目链接 题意 : 中文题.点链接 分析 : 有道题是问你不断求前缀和后的结果 Click here 这道题问的是逆过程 分析方法雷同.可参考 Click here ----------------- ...

  3. hdu1061(2015-N1):1.快速幂;2.找规律

    1.快速幂 原理:求a的b次方,将b转化为二进制数,该二进制位第i位的权是2^(i-1), 例如 11的二进制是1011 11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1 因此,我们将a¹ ...

  4. Gym 100952H&&2015 HIAST Collegiate Programming Contest H. Special Palindrome【dp预处理+矩阵快速幂/打表解法】

    H. Special Palindrome time limit per test:1 second memory limit per test:64 megabytes input:standard ...

  5. Binary Strings Gym - 101161G 矩阵快速幂 + 打表

    http://codeforces.com/gym/101161/attachments 这题通过打表,可以知道长度是i的时候的合法方案数. 然后得到f[1] = 2, f[2] = 3, f[3] ...

  6. 小白详细讲解快速幂--杭电oj2035-A^B

    Problem Description 求A^B的最后三位数表示的整数.说明:A^B的含义是“A的B次方”  Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<= ...

  7. hdu_3483A Very Simple Problem(C(m,n)+快速幂矩阵)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3483 A Very Simple Problem Time Limit: 4000/2000 MS ( ...

  8. 各种快速幂(qaq)

    今天分享下各种快速幂(有点坑),首先说一下快速幂的原理, 以下以求a的b次方来介绍 [1]  把b转换成二进制数. 该二进制数第i位的权为   例如 11的二进制是1011 11 = 2³×1 + 2 ...

  9. 2019牛客多校B generator 1——十进制快速幂

    题目 已知 $x_i = ax_i + bx_{i-1}$,求 $x_n \% MOD$.($1\leq n\leq 10^{(10^6)}$) 分析 写成矩阵快速幂的形式,相当于求转移矩阵的 $n$ ...

随机推荐

  1. break的使用for循环嵌套

    /* Name:break的使用for循环嵌套 Copyright: By.不懂网络 Author: Yangbin Date:2014年2月21日 02:54:04 Description:以下代码 ...

  2. 纯代码利用CSS3 圆角边框和盒子阴影 制作 iphone 手机效果

    原文:纯代码利用CSS3 圆角边框和盒子阴影 制作 iphone 手机效果 大家好,我是小强老师. 今天我们看下CSS3最为简单的两个属性. css3给我们带来了很多视觉的感受和变化,以前的图片做的事 ...

  3. Uber司机一周体验记:成单率仅57%

    虽然注册过程不顺利,但耗时一下午终究还是当上人民优步司机了.而且一周下来也完成了十几单,个中滋味恐怕只有载着陌生的乘客开上路才能体会. 第一单 一位赶去面试的年轻人,刚来北京两年,因为路线不熟坐错了公 ...

  4. 龟兔赛跑(DP)

    龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. ajax异步通讯 遮罩滚动栏,防止并发及误操作

    加入滚动栏的遮罩,滚动栏图片须要自己调整路径 function loading() { var divloading = "<div id=\"loadingdiv\&quo ...

  6. iOS 设置状态栏的颜色

    1.在plist文件中设置如下属性: 2.在delegate中设置 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarSt ...

  7. 五子棋Web版的开发(一)---搭建IDEA SSH环境

    最近公司都没啥事,我在完成了控制台版的本地五子棋后(github地址:https://github.com/lkq51/wuziqi_console2),想将他升级成为一个web版的五子棋游戏.因为公 ...

  8. 自己动手写 ASP.NET MVC 分页 part1

    学习编程也有一年半载了,从来没有自己动手写过东西,都是利用搜索软件找代码,最近偶发感慨,难道真的继续做码农??? 突发奇想是不是该自己动手写点东西,可是算法.逻辑思维都太弱了,只能copy网上的代码, ...

  9. [LeetCode]题解(python):070-Climbing Stairs

    题目来源: https://leetcode.com/problems/climbing-stairs/ 题意分析: 爬楼梯,一次可以爬一步或者两步.如果要爬n层,问一共有多少种爬法.比如说,如果是3 ...

  10. 【转】vs2008中leptonica-1.68安装配置

    tesseract ocr挺不好配置的,找到一篇不错的文章,分享如下:http://hi.baidu.com/ever8936/blog/item/6998e1196b1d0161dab4bd8f.h ...