链接:点击打开链接
题意:给出一个数n,求连续自然数和为n有几种情况;
代码:
#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
bool prime[10000005];
long long num[670000];
int main(){
long long i,j,k,n,t,sum,cur,temp;
k=0;
memset(prime,0,sizeof(prime));
for(i=2;i<10000005;i++){
if(!prime[i])
num[k++]=i;
for(j=0;j<k&&num[j]*i<10000005;j++){
prime[num[j]*i]=1; //线性素数筛
if(i%num[j]==0)
break;
}
}
cin>>t;
for(cur=1;cur<=t;cur++){
cin>>n;
sum=1;
printf("Case %lld: ",cur);
for(i=0;i<k&&num[i]*num[i]<=n;i++){
temp=0;
if(n%num[i]==0){
while(n%num[i]==0){ //根据推导就是求n所有奇数因子,注意是所有因子
temp++;
n/=num[i];
}
if(num[i]%2!=0)
sum*=(temp+1); //素因子分解求因子个数,每个数从0~temp可能有
} //temp+1中可能
}
if(n>1&&n%2!=0)
sum*=2;
cout<<sum-1<<endl; //去掉1这个因子
}
return 0;
}