Description
又是一年集訓時,剛出家裏趕來的LXX很是鬱悶。因爲CS市的天氣實在是難以忍受了,加之搬寢室到CS大學“老”校區。一天晚上CS大學“老”校區的寢室又停電了,LXX和室友實在是難以呆下去了。於是商量一起去網吧吹空調,但是誰請客是個問題。LXX的室友小Z便甩出一個問題給LXX,只要LXX在1S內計算出來便請客。問題如下:
我有n個數,a[1]~a[n],初始值均爲0,現在我要執行n次操作(操作1到操作n),操作i爲:把所有的a[t]反轉(t%i==0,反轉即0->1,1->0)。如果最後的a[i]爲1,則稱i爲LXX數。求最後又多少個LXX數。奈何LXX太弱了,爲了能夠免費去網吧吹空調,他決定尋求你的幫助。
Input
大量多組數據。每行一個正整數N(N<=1e18)
Output
每行輸出一個正整數,即答案LXX的數量。
Sample Input
2 15
Sample Output
1 3
Hint
題目大意:
n次操作,每次把下標爲i的倍數的a[t]反轉,問最終a數組中有多少個位置爲1。
解題思路:
考慮哪些位置的a[i]最終爲1,最終爲1說明此位置被反轉了奇數次,即i有奇數個因子,而有且僅有完全平方數有奇數個因子,所以答案爲sqrt(n)。
注意點:
本題數據較多,使用cin,cout會超時,建議改用scanf,printf。
代碼:#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
long long n;
while(scanf("%lld",&n)!=EOF)
{
long long help = (int)sqrt(n);
printf("%ld\n",help);
}
}
/**********************************************************************
Problem: 1970
User: liyingshou
Language: C++
Result: AC
Time:64 ms
Memory:1128 kb
**********************************************************************/