題目描述:
給出整數 x
xx,求它的約數個數
為了加大難度,有 m
mm 次詢問,將每次詢問的答案求和然後模 109
+7
10^9+7
109+7
輸入格式:
第一行是乙個整數 mmm
第二行是整數 q
1q_1
q1,a
aa,b
bb,ccc
q
1q_1
q1 表示第一次詢問的數字
第 i
ii 次詢問 qi=
(qi−
1∗a+
b)%c
q_i=(q_∗a+b)\%c
qi=(q
i−1
∗a+b
)%c
輸出格式:
所有詢問的答案之和模 109
+7
10^9+7
109+7
樣例資料:輸入
22 2 1 9 輸出
4 100
%100\%
100%
的資料保證 m≤3
×106
,a,b
,c≤1
07,q
i≥1,
c≥
1m\leq 3\times 10^6, a,b,c\leq10^7,q_i≥1,c≥1
m≤3×10
6,a,
b,c≤
107,
qi≥
1,c≥
1。看到這道題的資料範圍, q
qq 是 107
10^7
107 級別的,所以應該是 o(n
)o(n)
o(n)
的複雜度
然後打了個暴力,去看正解,發現是用線性篩來篩約數個數,然後就學了一下
首先,新定義兩個陣列 g[i] 和 num[i],g[i] 表示 i
ii 的約數個數,num[i] 表示 i
ii 最小質因數的個數
舉個例子,對於 12,g[12]=6,num[12]=2(因為 12=2*
2*3)
有乙個結論,如果把乙個數分解成 p1a
1⋅p2
a2⋯p
ka
kp_1^\cdot p_2^}\cdots p_^
p1a1
⋅p2a
2⋯
pkak
,那麼乙個數的約數個數應為 ∏i=
1k(a
i+1)
\prod ^_(a_i+1)
∏i=1k
(ai
+1)
現在分三種情況討論一下:
1、若 i 為質數,那麼顯然 g[i]=2,num[i]=1
2、若 i 為合數
pp,這個因數為 xxx
(1)若 x
xx 為 p
pp 的倍數,此時 p
pp 就是 i
ii 和 x
xx 的最小質因數,也即若把 x
xx 表示成 (num[x]+1)*k(k
kk 為其他的質因個數 +1 的乘積),i
ii 就可以表示成 (num[x]+2)*k ∴
\therefore
∴ 此時, g[i]=g[x]/(num[x]+1)*(num[x]+2),num[i]=num[x]+1
(2)若 x
xx 不為 p
pp 的倍數,因為 p
pp 是 i
ii 的最小質因數,所以易知 num[i]=1,並且 i
ii 相當於只是在 x
xx 的基礎上多乘了乙個 p
pp,所以 g[i]=g[x]*2
#include
#include
#include
#define n 10000005
#define mod 1000000007
using
namespace std;
int prime[n]
,g[n]
,num[n]
;bool mark[n]
;void
linear_sieves()
for(j=
1;j<=sum&&i*prime[j]
++j)
num[i*prime[j]]=
1;g[i*prime[j]
]=g[i]*2
;}}}
intmain()
printf
("%d"
,ans)
;return0;
}
約數個數 約數之和
給乙個數n,求它的約數個數 因為n可以唯一分解成質因數的乘積即 n p 1 p 2 p t 所以n的約數c的形式應該是 c p 1 p 2 p t 對於任何兩組不同的 beta 1,beta t 的取值,由算數基本定理得c是不同的,由於 beta i 的取值為 0,1,alpha i 共 alpha...
約數個數定理
編輯 對於乙個大於1正整數n可以 分解質因數 則n的 正約數的個數就是 其中a 1 a2 a 3 ak是p 1 p2 p 3,p k的指數。編輯首先同上,n可以 分解質因數 n p1 a1 p2 a2 p3 a3 pk ak,由約數定義可知p1 a1的約數有 p1 0,p1 1,p1 2.p1 a1...
數論 約數個數
這題是個大水題,只不過資料稍微大了點。結果大家都用那啥的模擬。結果哈哈哈哈哈哈。求a b之間每個數的約數個數的總和。input 一行兩個正整數a b,以乙個空格隔開。output 一行乙個整數,即答案。資料範圍 對於50 的資料,1 a b 1000 對於100 的資料,1 a b 10,000,0...