昔読んだ学習漫画の知識が活きた…。
http://codeforces.com/contest/396/problem/B
解法
v(x) <= n < u(x)となるnでは、常に1/v(n)u(n)は一定である。
ここで上記総和の式がどうなるか見てみると、となっている。
ここで、であることを考えると1/3同士、1/5同士、1/7同士…が足し引きで消えていくことがわかる。
結局残るのは最初の項と最後の項だけなので、が答え。
v(n)とu(n)はnから1ずつ数字を増減させて素数判定すれば間に合う。
ll isprime(ll a) { for(ll b=2;b*b<=a;b++) { if(a%b==0) return 0; } return 1; } void solve() { int f,i,j,k,l,x,y; int T; cin>>T; while(T--) { ll N,L,M; cin>>N; L=N,M=N+1; if(isprime(M)) { _P("%lld/%lld\n",M-2,2*M); continue; } while(isprime(L)==0) L--; while(isprime(M)==0) M++; ll aa=L*M-2*M+2*(N-L+1); ll bb=2*L*M; ll g=__gcd(aa,bb); _P("%lld/%lld\n",aa/g,bb/g); } }
まとめ
という関係を昔読んだ学習漫画で覚えていたのが、ここで役に立った。