ACM-ICPC 2018 南京賽區網路預賽__J. Sum【尤拉篩法+質因子分解+思維】
- 1000ms
- 512000K
A square-free integer is an integer which is indivisible by any square number except 1. For example, 6=2⋅3 is square-free, but 12=2^2⋅3 is not, because 2^2 is a square number. Some integers could be decomposed into product of two square-free integers, there may be more than one decomposition ways. For example, 6=1⋅6=6⋅1=2⋅3=3⋅2,n=ab and n=ba are considered different if a̸=b.f(n) is the number of decomposition ways that n=ab such that a and b are square-free integers. The problem is calculating f(1)+f(2)+...+f(n).
Input
The first line contains an integer T(T≤20), denoting the number of test cases.
For each test case, there first line has a integer n(n≤2⋅10^7).
Output
For each test case, print the answer f(1)+f(2)+...+f(n) .
Hint
∑f(i)=f(1)+⋯+f(8)
=1+2+2+1+2+4+2+0=14=1+2+2+1+2+4+2+0=14.
樣例輸入
2
5
8
樣例輸出
8
14
題目來源
題目大意:f(n)定義為n=a*b這樣分解的式子數,其中a和b不能包含平方因子。當a!=b時n=a*b和n=b*a視為兩個式子。t 組測試,n表示所求結果為 f(1)+f(2)+f(3)+...+f(n)
題解:有如下結論
1.若i是素數則f(i)=2
2.若i的某個質因子個數超過2,則f(i)=0。這個結論很好想,如果有大於2個相同質因子,那麼對於i的每個分解 i=a*b,a和b中必定有一個數含平方因子
3.若i=a*b且a和b不含相同因子即可,那麼f(i)=f(a)*f(b)
4.若i的質因子x的個數為2,f(i)=f(i/(x*x))即為去掉平方因子的個數
打表用到了尤拉篩法
AC的C++程式碼:
#include<iostream>
using namespace std;
const int N=2e7+5;
int prime[N];//儲存連續素數,prime[0]表示連續素數的個數
bool vis[N];
int f[N];//結果
void solve()
{
f[1]=1;
for(int i=2;i<N;i++){
if(!vis[i]){
prime[++prime[0]]=i;//儲存這個素數
f[i]=2;//素數的結果為2
}
for(int j=1;j<=prime[0]&&prime[j]*i<N;j++){
int x=prime[j]*i;
vis[x]=true;//標記x為合數
if(i%prime[j])//若i=a*b且a和b不含相同因子即可,那麼f(i)=f(a)*f(b)
f[x]=f[prime[j]]*f[i];
else{//如果prime[j]是i的最小質因子
if(i%(prime[j]*prime[j])==0)//如果x的某個質因子個數超過2則f[i]=0
f[x]=0;
else//如果x的某個質因子個數為2,則答案為去掉平方項的結果
f[x]=f[x/(prime[j]*prime[j])];
break;//尤拉篩法保證每個合數只被它的最小質因子篩去,因此要跳出
}
}
}
//字首和
for(int i=1;i<N;i++)
f[i]+=f[i-1];
}
int main()
{
int t,n;
solve();
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%d\n",f[n]);
}
return 0;
}
解法二
#include<iostream>
using namespace std;
typedef long long ll;
const int N=20000007;
int prime[N+1];
ll f[N+1];
void solve(int n)
{
f[1]=1;
for(int i=2;i<=n;i++)
{
if(!prime[i])
{
prime[++prime[0]]=i;
f[i]=2;
}
for(int j=1;j<=prime[0]&&prime[j]<=n/i;j++)
{
prime[i*prime[j]]=1;
if(i%prime[j])
{
f[i*prime[j]]=f[i]*2;
}
else//i%prime[j]==0
{
if((i/prime[j])%prime[j]==0)
f[i*prime[j]]=0;
else
f[i*prime[j]]=f[i/prime[j]];
break;
}
}
}
for(int i=2;i<=n;i++)
f[i]+=f[i-1];
}
int main()
{
int t,n;
solve(N);
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%lld\n",f[n]);
}
return 0;
}
相關文章
- ACM-ICPC 2018 南京賽區網路預賽__B The writing on the wall【列舉】ACM
- ACM-ICPC 2018 徐州賽區網路預賽ACM
- ACM-ICPC 2018 瀋陽賽區網路預賽ACM
- ACM-ICPC 2018 南京賽區網路預賽__E AC Challenge【狀態壓縮+DP】ACM
- ACM-ICPC 2018 徐州賽區網路預賽 F. Features TrackACM
- ACM-ICPC 2018 南京賽區網路預賽__K The Great Nim Game【博弈論+費馬小定理+DP】ACMGAM
- ACM-ICPC 2018 南京賽區網路預賽 __G Lpl and Energy-saving Lamps【線段樹+模擬】ACMLAMP
- ACM-ICPC 2018 南京賽區網路預賽__L. Magical Girl Haze 【Dijkstra演算法+分層圖思想】ACM演算法
- ACM-ICPC 2018 徐州賽區網路預賽 I. Characters with Hash【簽到題】ACM
- 質數判斷、質因子分解、質數篩
- 2019ICPC南京網路賽B super_log——擴充套件尤拉定理套件
- 尤拉篩線性篩質數
- 素數篩(埃氏篩法與尤拉篩)
- 尤拉篩
- 2018icpc 南京網路賽L Magical Girl Haze
- 尤拉篩(線性篩)
- 1366: 分解質因子
- Sum of Consecutive Prime Numbers POJ - 2739(線性尤拉篩+尺取法)
- 2018 瀋陽賽區網路預賽 I.Lattice's basics in digital electronics(模擬)Git
- 2018 北京賽區網路預選賽 A. Saving Tang Monk II(BFS+優先佇列)佇列
- HDU 6311 - Cover [2018杭電多校聯賽第二場 C](尤拉通路/迴路)
- 2018 ICPC南京區域賽題解 更新至 8 題
- 素數個數 <埃式篩 && 尤拉篩>
- 2018 徐州網路賽 G 題解
- 第43屆ACM-ICPC國際大學生程式設計競賽 亞洲區域賽南京站現場賽名額分配相關說明ACM程式設計
- 尤拉路徑
- 2018世界盃烏拉圭vs法國誰會贏 1/4決賽烏拉圭vs法國比分預測
- 2018華為網路技術大賽
- 威馬汽車閆楓:造車新賽道的網際網路思維
- 高校網路安全管理運維賽2024運維
- 信奧日記——數論(快速冪、埃氏篩、尤拉篩)
- Wanafly挑戰賽25 A因子
- 2024高校網路安全管理運維賽 wp運維
- 為加快南京AI產業發展,2018全球(南京)人工智慧應用大賽現公開徵集賽題原型AI產業人工智慧原型
- 沙漠or綠洲,從南京軟博會I.D.Spark網際網路創新大賽看南京網際網路發展Spark
- 2024 ICPC 網路預選賽 第 2 場
- 尤拉函式性質和模版函式
- MES模賽思軟體質量工具更新