比賽的時候有想到一次找所有數的乙個共同因數,結果沒有考慮素數的情況,想歪了,成了莫比烏斯反演。。。。。
素數定理:任意乙個數都可以表示為n=
pa11
pa22
…pak
k ,n的所有因子個數為(a
1+1)
(a2+
1)…(
ak+1
) ,然後對與每個在範圍內的質數,都進行一次遍歷,看是不是l-r中某些數的因子。
明白了同時對乙個質數都詢問是否是l~r中每個數的質數,大大提高了效率。明明能想到,卻還是差那麼一點,就是題刷的太少。。
code:
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define ll long long
#define mem(a) memset(a,0,sizeof(a))
const
int eps=1e-8;
const
int maxn=1000010;//須填寫
const
int inf=0x3f3f3f3f;
const ll mod=998244353;
ll j,i;
ll l,r,k;
ll p[maxn];
int vis[maxn];
ll sum[maxn];
ll num[maxn];//因為區間大小最大為10^6所以maxn就夠了,不過輸入的時候要處理
void work(int snum)
sum[ii-l]=sum[ii-l]*(res*k+1)%mod;
sum[ii-l]%=mod;}}
}int main()
}int kase;
scanf("%d",&kase);
while(kase--)
//這裡如果直接從l開始,陣列會存不開
for(i=1;iif(p[i]*p[i]>r)
break;
work(p[i]);
//cout<}
ll res=0;
for(i=0;i<=r-l;i++)
//coutres%=mod;
}res%=mod;
cout
0;}
HDU 6069 素數篩法
思路 設 n p 1 p 2 p m n p 1 c 1 p 2 c 2 p m c m 則d n k kc 1 1 kc 2 1 kc m 1 d n c 1 1 c2 1 c m 1 則 d n k kc 1 1 kc 2 1 kc m 1 d n k kc 1 1 kc 2 1 k c m 1...
HDU 6069 素數篩 分解質因子
給乙個起點為l終點為r的區間,求這個區間內的數的k次方的全部因子有多少個。設 n p1 c1 p2 c2.則d n k k c1 1 k c2 1 r l 1e6 先篩出10 6內的素數,再分解出 l,r 裡面的質因子,大於1e6的質數直接為 k 1 個因子。include using namesp...
hdu6069 區間素數篩
hdu6069 counting divisors 傳送門題意 計算 sum d i k mod 998244353 其中 d n 表示 n 的約數個數,其中 1 leq l leq r leq 1e12,r l leq 1e6,1 leq k leq 1e7 題解 根據唯一分解定理 n p 1 p...