生活随笔
收集整理的這篇文章主要介紹了
Graph Theory Class(Min25求1~n质数和)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Graph Theory Class
原理不會板子抄的。
#include <bits/stdc++.h>
#define ll long long
using namespace std
;
const int N
= 10000010;ll n
,mod
;
int prime
[N
],id1
[N
],id2
[N
],vis
[N
],cnt
,m
;
ll g
[N
],s
[N
],a
[N
],T
;
int ID(ll x
){return x
<=T
?id1
[x
]:id2
[n
/x
];}
ll
calc(ll x
){return x
*(x
+1)/2-1;}
ll
f(ll x
){return x
;}
ll
init(ll n
)
{T
=sqrt(n
+0.5);for(int i
=2;i
<=T
;i
++) {if(!vis
[i
])prime
[++cnt
]=i
,s
[cnt
]=s
[cnt
-1]+i
;for(int j
=1;j
<=cnt
&&i
*prime
[j
]<=T
;j
++) {vis
[i
*prime
[j
]]=1;if(i
%prime
[j
]==0)break;}}for (ll l
=1;l
<=n
;l
=n
/(n
/l
)+1) {a
[++m
]=n
/l
;if(a
[m
]<=T
)id1
[a
[m
]]=m
; else id2
[n
/a
[m
]]=m
;g
[m
]=calc(a
[m
]);}for(int i
=1;i
<=cnt
;i
++)for(int j
=1;j
<=m
&&(ll
)prime
[i
]*prime
[i
]<=a
[j
];j
++)g
[j
]=g
[j
]-(ll
)prime
[i
]*(g
[ID(a
[j
]/prime
[i
])]-s
[i
-1]);
}
ll
solve(ll x
)
{if(x
<=1)return x
;return n
=x
,init(n
),g
[ID(n
)];
}
void clear()
{memset(g
,0,sizeof(g
));memset(a
,0,sizeof(a
));memset(s
,0,sizeof(s
));memset(prime
,0,sizeof(prime
));memset(id1
,0,sizeof(id1
));memset(id2
,0,sizeof(id2
));memset(vis
,0,sizeof(vis
));cnt
=m
=0;
}
int main() {int Tc
;scanf("%d",&Tc
);while(Tc
--){clear();scanf("%lld%lld",&n
,&mod
);ll ans
=0;if(n
&1) ans
=(n
-1)/2%mod
*(n
+4)%mod
;else ans
=(n
+4)/2%mod
*(n
-1)%mod
;ans
=(ans
+solve(n
+1)-2)%mod
;ans
=(ans
+mod
)%mod
;printf("%lld\n",ans
);}return 0;
}
總結
以上是生活随笔為你收集整理的Graph Theory Class(Min25求1~n质数和)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。