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 也非常大,所以對於
上述的 m,x1,a,b,c 是給定的正整數。
基準時間限制:1.3 秒 空間限制:131072 KB
題解:
先隨便反演一下。
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 比較坑的題目。 題意就是:給出一堆石子,一次操作可以變成它的約數個,也可以拿只拿一個,不能變成一個,最後拿的人輸。 經過打表發現 幾乎所有質數都是先手必敗的,幾乎所有合數都是先手
【二分圖】ZJOI2007小Q的遊戲
格子 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需要列一個表格,表