Codechef:Short II /SHORT2
阿新 • • 發佈:2018-11-01
題解:
首先轉化成求
的對數。
(當然我也不知道是怎麼轉化的,反正大家都不知道)
然後就比較套路了, 中若有值是 的倍數則先除掉,然後變成 。發現 ,然後 。
列舉一下 中的較小值,因為 ,所以對於一個特定的較小值, 的解的個數是 的,暴力算一下就行了。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL p,lim,ans;
inline void solve() {
cin>>p; ans=0;
lim=sqrt(p+2+sqrt(p+1));
for(LL b=1;b<=lim;b++) {
LL a=-p%b+b, d=(a+p)/b;
if((!((d+1)%a)) && a<b && b<=d && a%p && b%p) ++ans;
}
for(LL d=1;d<=lim;d++) {
LL a=-p%d+d;
do {
if(!((d+1)%a)) {
LL b=(a+p)/d;
if(a<b && d<b && a%p && b%p) ++ans;
}
} while(a<=d+1 && (a+=d));
}
cout<<3*(2*ans+1)+5<<'\n';
}
int main() {
int T; cin>>T;
while(T--) solve();
}