题目意思:给出sigma函数的意义:sigmafunction(x)=x的因子之和
x=p1^(e1)*p2^e2*...*pk^ek
sigmafunction(x)=(p1^(e1+1)-1)/(p1-1)*(p2^(e2+1)-1)/(p2-1)*...*(pk^(ek+1)-1)/(pk-1).
求1~n之间的偶数值的个数。
对于指数为0的项,(px-1)/(px-1)=1
需要素数表。
然后数据范围是1e12怎么开内存都会超,循环的话时间估计也是超限。
觉得就是找规律了
发现 平方数和平方数*2 对应的sigmafunction对应的值是奇数
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll maxn=1e6+5;
/**
给出因子总和公式 sigma函数
利用唯一分解定理
*/
int len=0;
int prime[maxn],status[maxn];
void workprime()
{
memset(status,0,sizeof(status));
for(int i=2;i<=maxn;i++)
{
if(!status[i])
{
prime[len++]=i;
for(int j=i;j<=maxn;j+=i)
status[j]=1;
}
}
}
int main()
{
int t;
/*workprime();
for(int j=1;j<=200;j++)
{
ll num=j,ans=1;
for(int i=0;i<len&&prime[i]<=num;i++)
{
ll temp=0,ans2=1;
while(num%prime[i]==0)
{
ans2*=prime[i];
temp++;
num/=prime[i];
}
//printf(" %I64d",ans2);
ans*=(ans2*prime[i]-1)/(prime[i]-1);
}
}*/
scanf("%d",&t);
for(int j=1;j<=t;j++)
{
ll n;
scanf("%lld",&n);
printf("Case %d: %lld\n",j,n-(ll)sqrt(n)-(ll)sqrt(n/2));
}
return 0;
}