日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的What day is that day?(快速幂,打表找周期,或者求通项公式)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。