HDU2608 0 or 1
題目:0 or 1
?
分析:
?
首先看T(n),通過找規律可以發現:(看了別人的解題報告才知道這部分是怎么推出來的)
?
僅當n為1,2,4,8,9,16,18,25,32,36,49,50,64,72,81,98,100…………的時候,T(n)%
2==1;
?
可以發現,if(n%(i*i)==0 || n%(i*i*2)==0) => T(n)%2==1;
?
然后對S(n),只要看在n前面,有幾個T(k)是為1即可,
?
即是找有多少個數是滿足的即可;
?
我推到這,結果沒利用找到的規律求個數,而是用了一個循環,結果超時了~~
?
求個數的時候,其實可以利用滿足(i*i<=n || i*i*2<=n)這個關系式,如下:
?
(int)sqrt(n)+(int)sqrt(n/2.0)
?
看來別人的解題報告才知道:求T(n)的時候是這么推出來的:
?
對于T(n),設n=2^k*p1^s1*p2^s2*...*pm^sm,則T(n)=(2^0+2^1+...+2^k)*(p1^0+p1^1+...+p1^s1)
*...*(ps^0+ps^1+...+ps^sm);
?
因為(2^0+2^1+...+2^k)%2==1始終成立,則T(n)%2的結果取決于(pi^0+pi^1+...+pi^si)%2,只要其中一
個為0,則T(n)%2==0。所以只要有一個si為
奇數時,T(n)%2==0。即n為2^k*m^2時,T(n)為1。顯然n也即m^2或2*m^2時,T(n)為1。
#include <stdio.h> #include <math.h> int main() {int n,count,cas;scanf("%d",&cas);while(cas--){scanf("%d",&n);count=(int)sqrt(n)+(int)sqrt(n/2.0);printf("%d\n",count%2);}return 0; }
?
總結
以上是生活随笔為你收集整理的HDU2608 0 or 1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 特殊方法求1~n的和
- 下一篇: NEFU394 素数价值