1. 程式人生 > >51nod 1643 小Q的家庭作業

51nod 1643 小Q的家庭作業

Description:

定義 f(n) 表示 1 到 n 這 n 個數,同 n 的最大公約數的和。
例如 f(1)=1,f(2)=3,f(3)=5,f(6)=15 ,比如 n=6 時 1,2,3,4,5,6 同 6 的最大公約數分別為 1,2,3,2,1,6 ,它們的和是 15 。
小Q遇到了一個問題,Nod老師要求他回家計算 g(n)=∑d|nf(d) 這個函式模 1000000007 的值,例如 g(6)=f(1)+f(2)+f(3)+f(6)=24 。
小Q想了一下,如果有 n≤109 的條件,那麼他是會做的,但是現在這個 n 非常的大,他覺得有點不太會算了,你能幫他計算一下 g(n) 模 1000000007 的值嗎?
由於 n 非常大,所以 n 被表示成了 m 個正整數 x1,x2,⋯,xm 的乘積,即 n=∏mi=1xi 。
由於 m 也非常大,所以對於 x

i(1i<m) 有 xi+1=((a⋅xi+b)modc)+1 的關係。
上述的 m,x1,a,b,c 是給定的正整數。

基準時間限制:1.3 秒 空間限制:131072 KB

題解:

先隨便反演一下。
g(n)=d|nf(d)
=d|nd|ddφ(d/d)
=d|ndd|nddφ(ndd)
=d|nd(n/d)
=d|nn
=nσ0(n)

m雖然很大,但是c很小,所以可以找x的迴圈節。

現在需要快速將10000000個數分解質因數,可以線篩每個數的最小質因子和指數及對應的次冪,然後暴力統計,注意這題時限卡的很緊,一開始我這麼做,然後T飛了。

於是去百度上膜了下標,發現只需要記錄最小質因子,然後倒著掃一遍即可。

注意空間卡得也緊,所以需要重複利用陣列。

Code:

#include<cstdio>
#include<cstring>
#define ll long long
#define fo(i, x, y) for(int i = x; i <= y; i ++)
#define fd(i, x, y) for(int i = x; i >= y; i --)
using namespace std;

const int N = 1e7, mo = 1e9 + 7;

int
p[700000], u[N + 5], x[N + 5], bz[N + 5]; int a, b, c; ll m, ans; void Build() { fo(i, 2, N) { if(!bz[i]) p[++ p[0]] = i, u[i] = i; fo(j, 1, p[0]) { int k = i * p[j]; if(k > N) break; bz[k] = 1; u[k] = p[j]; if(i % p[j] == 0) break; } } } ll ksm(ll x, ll y) { ll s = 1; for(; y; y >>= 1, x = x * x % mo) if(y & 1) s = s * x % mo; return s; } void add(int &x, int y) { x += y, x = x >= mo ? x - mo : x; } int main() { scanf("%lld %d %d %d %d", &m, &x[1], &a, &b, &c); Build(); memset(bz, 0, sizeof(bz)); int k = 1; bz[x[1]] = 1; while(1) { x[k + 1] = ((ll)x[k] * a + b) % c + 1; k ++; if(bz[x[k]]) break; bz[x[k]] = k; } int last = bz[x[k]] - 1; k --; int round = k - last; memset(bz, 0, sizeof(bz)); ans = 1; int tem = (m - last) / round % mo; fo(i, last + 1, k) { ans = ans * x[i] % mo; add(bz[x[i]], tem); } ans = ksm(ans, (m - last) / round % (mo - 1)); fo(i, 1, last) ans = ans * x[i] % mo, add(bz[x[i]], 1); tem = (m - last) % round; fo(i, last + 1, last + tem) ans = ans * x[i] % mo, add(bz[x[i]], 1); fd(i, N, 2) if(bz[i] && u[i] != i) add(bz[u[i]], bz[i]), add(bz[i / u[i]], bz[i]); fo(i, 1, p[0]) ans = ans * (bz[p[i]] + 1) % mo; printf("%lld", ans); }

相關推薦

51nod 1643 Q家庭作業

Description: 定義 f(n) 表示 1 到 n 這 n 個數,同 n 的最大公約數的和。 例如 f(1)=1,f(2)=3,f(3)=5,f(6)=15 ,比如 n=6 時 1,2,3,4,5,6 同 6 的最大公約數分別為 1,2,3,2,1,

[51nod]1778 Q的集合[lucas定理+組合計數]

題目 小Q有一個集合 ,它的元素個數 。 對於  的任意一個子集合 ,定義  ,定義 關於 的補集為 。 小Q想知道,如果他等概率地選擇一個  的子集 ,那麼 的方差是多少。 由於這個方差值可能很大,不妨設其為  ,你只需要給出  的值即可。 題解 可以看出具有對

51nod 1778 Q的集合

1778 小Q的集合 題目中是給定了一個集合S 並且有 ∣∣S∣∣=n 要說明的是。這個集合是沒有重複元素的集合。(這一點很重要) 其實不特別說明。一般集合也都沒有重複元素。 集合S的子集數量等價於 從 S 中取元素的取法數量。(高中數學)

51nod 1778 Q的集合 lucas定理+線性篩+數學

題意 小Q有一個集合SS,它的元素個數|S|=n|S|=n。 對於SS的任意一個子集合TT,定義f(T)=|T|kf(T)=|T|k,定義TT關於SS的補集為S−TS−T。 小Q想知道,如果他等概

開心的Q 51Nod - 1742

span aps origin main const break else eof pre 開心的小Q 51Nod - 1742 交不上去,應該是可以過的吧~ 1 #include <bits/stdc++.h> 2 using namespac

[方差+lucas定理] 51nod 演算法馬拉松25 D. Q的集合

題意 小Q有一個集合 S ,它的元素個數 |S|=n 。 對於 S 的任意一個子集合 T ,定義 f(T)=|T|k ,定義 T 關於 S 的補集為 S−T 。 小Q想知道,如果他等概率地選擇一個

51nod 1831 C的遊戲(博弈論+打表)

%d cstring tdi urn 博弈 ring stream 導出 logs 比較坑的題目。 題意就是:給出一堆石子,一次操作可以變成它的約數個,也可以拿只拿一個,不能變成一個,最後拿的人輸。 經過打表發現 幾乎所有質數都是先手必敗的,幾乎所有合數都是先手

【二分圖】ZJOI2007Q的遊戲

格子 scan clas ecn 輸出 每次 他還 顏色 sed 660. [ZJOI2007] 小Q的矩陣遊戲 ★☆ 輸入文件:qmatrix.in 輸出文件:qmatrix.out 簡單對比 時間限制:1 s 內存限制:128 MB 【問題描述】

Python <---> 課題練習作業

put order idt rip mil borde input family 嵌套 作業一: 輸出目錄,可以選擇目錄進入,可以回退、推出! #conding:utf8menu = {‘北京‘:{‘昌平‘:{‘沙河‘:{‘昌平婦幼‘,}},‘海澱‘:

重慶OI2017 Q 的棋盤

define print 1.0 gcd second clu urn 連通 logs 小 Q 的棋盤 時間限制: 1 Sec 內存限制: 512 MB 題目描述 小Q正在設計一種棋類遊戲。在小Q設計的遊戲中,棋子可以放在棋盤上的格點中。某些格點之間有連線,棋子

【bzoj4972】Q的方格紙 前綴和

sample 面積 滿了 div zoj pac 需要 fine namespace 題目描述 方格紙與草稿紙一樣,都是算法競賽中不可或缺的重要工具。身經百戰的小Q自然也會隨身帶著方格紙。小Q的方格紙有n行m列,一共n*m個方格,從上到下依次標記為第1,2,...,n行,

[BZOJ4815][CQOI4815]Q的表格 數論+分塊

-s 影響 online ans uri color www zoj 表格 題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=4815 題目中所給條件中的(a,a+b)和(a,b)的關系很矚目。 然後大家都知道(a,b

[ZJOI2007] Q的矩陣遊戲【解題報告】

i++ 想要 文件 lose () 決定 tdi 匹配 amp 戳我 660. [ZJOI2007] 小Q的矩陣遊戲 ★★☆ 輸入文件:qmatrix.in 輸出文件:qmatrix.out 簡單對比時間限制:1 s 內存限制:128 MB 【問題

深入理解計算機系統_3e 第四章家庭作業(部分) CS:APP3e chapter 4 homework

ray design sed copy default ror this 處理 implement 4.52以後的題目中的代碼大多是書上的,如需使用請聯系 [email protected] 流水線部分只寫了偶數題號的,這幾天太浮躁,落下了好多課。。。 4.

深入理解計算機系統_3e 第八章家庭作業 CS:APP3e chapter 8 homework

fig lar man message -- ali rail raise mat 8.9 關於並行的定義我之前寫過一篇文章,參考: 並發與並行的區別 The differences between Concurrency and Parallel +----------

BZOJ4017:Q的無敵異或

長度 原因 stat con sum nlog 之前 時間復雜度 solution Link 題意:有一個長度為 \(N\) 的數列,求其 \[\sum 所有子數列異或和\] 以及\[XORSUM \{子數列求和\}\] \(1 \leq N \leq 10^5,元素 0

CSAPP家庭作業(第二章)

inter image 要求 temp tar type gpo color def 2.55(*) #include <stdio.h> typedef unsigned char *byte_pointer; void show_bytes(byte_

深入理解計算機系統_3e 第十一章家庭作業 CS:APP3e chapter 11 homework

cep serve 技術分享 apn only class control 相同 法則 註:tiny.c csapp.c csapp.h等示例代碼均可在Code Examples獲取 11.6 A. 書上寫的示例代碼已經完成了大部分工作:doit函數中的printf("%

BZOJ [Cqoi2017] Q的棋盤

amp pac con 深度 body for ont light ted 題解:枚舉最後在哪裏停止,然後剩下的步數/2 也就是找最大深度 枚舉終止位置算是一種思路吧 #include<iostream> #include<cstdio> #inc

[bzoj4815] [洛谷P3700] [Cqoi2017] Q的表格

題解 end space pac mark 一個 var 變化 我不 Description 小Q是個程序員。 作為一個年輕的程序員,小Q總是被老C欺負,老C經常把一些麻煩的任務交給小Q來處理。 每當小Q不知道如何解決時,就只好向你求助。為了完成任務,小Q需要列一個表格,表