原题链接:http://acm.nefu.edu.cn/JudgeOnline/problem/119.jsp
本来数论就弱爆,又忽略了精度调整wa了一下午。
直接用公式表示为:
sum = ([2n / p] - 2[n / p]) + ([2n / p2] - 2[n / p2]) +……+ ([2n / pt] - 2[n / pt])
其中 t = [logp(2n)]。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 5 int main() 6 { 7 int t, n, p, i, cnt, m; 8 scanf("%d", &t); 9 while(t --) 10 { 11 scanf("%d%d", &n, &p); 12 int s = (int)(log10(2.0 * n) / log10(p + 0.0) + 1e-6); // ! 13 for(cnt = 0, m = i = 1; i <= s; i ++) 14 { 15 m *= p; 16 cnt += (2 * n) / m - 2 * (n / m); 17 } 18 printf("%d\n", cnt); 19 } 20 return 0; 21 }
从double强制转化为int的时候都是要调整精度的!!!