Sigma Function
Sigma function is an interesting function in Number Theory. It is denoted by the Greek letter Sigma (σ). This function actually denotes the sum of all divisors of a number. For example σ(24) = 1+2+3+4+6+8+12+24=60. Sigma of small numbers is easy to find but for large numbers it is very difficult to find in a straight forward way. But mathematicians have discovered a formula to find sigma. If the prime power decomposition of an integer is
Then we can write,
For some n the value of σ(n) is odd and for others it is even. Given a valuen, you will have to find how many integers from 1 ton have even value of σ.
Input starts with an integer T (≤ 100), denoting the number of test cases.
Each case starts with a line containing an integer n (1 ≤ n ≤ 1012).
OutputFor each case, print the case number and the result.
4
3
10
100
1000
Sample Output
Case 1: 1
Case 2: 5
Case 3: 83
Case 4: 947
题干如上,σ(n)函数得到了n的所有因子和,题目要求给出数字x,在[1,x]范围内找到所有符合要求的x0,使σ(x0)为偶数,并输出这样的数字数量;
时间卡的太紧了,最开始用算术基本定理+遍历暴力一波得啦一个TLE
于是本蒟蒻只能通过找规律的方法,在头发快要掉光的时候,终于发现了凡是平方数和平方数的二倍和都为奇数,那么只要求这些数的数量并用x减去即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 1000005
using namespace std;
typedef long long ll;
bool a[maxn];
void sqrtfound()
//找到所有平方数,只遍历到1e6
{
for(int i=1;i<maxn;i++)
{
if((ll)i*i>=maxn)
break;
a[i*i]=true;
}
}
int main()
{
sqrtfound();
int n;
scanf("%d",&n);
for(int k=1;k<=n;k++)
{
ll t,count;
scanf("%lld",&t);
count=t;
for(ll j=1;;j++)
{
if(j*j<=t)
//如果j*j这个平方数小于t,减去
{
count--;
}
if(2*j*j<=t)
//如果j*j这个平方数的2倍小于t,也减去
{
count--;
}
if(j*j>t)//循环终止条件写到for里边了
{
break;
}
}
printf("Case %d: %lld\n",k,count);
}
return 0;
}