题意:给你一个数n(n<=10^14),然后问n能用几个连续的数表示;
思路:设是以x开始的一段数的和为n,且有y个数,n=(x+x+y-1)*y/2。化简为n/y-(y-1)/2=x。因为x为整数,所以(y-1)/2和n/y都为整数。所以y-1为偶数,y为奇数。所以方案的种数就是n的奇数因子的个数。
所以对于唯一分解定理,其答案就是奇数质因子的幂次+1的乘积,最后去掉1。
#include<stdio.h> #include<math.h> #include<string.h> #include<map> #include<vector> #include<algorithm> #define N 2000006 #define ll long long #define ull unsigned long long using namespace std; bool vis[10000010]; int prime[N]; int main() { int k=0; for(int i=2;i<=10000000;i++) { if(!vis[i]) { prime[k++]=i; for(int j=i+i;j<=10000000;j+=i) vis[j]=1; } } int t; int u=0; scanf("%d",&t); while(t--) { ll n; scanf("%lld",&n); ll ans=1; for(int i=0;i<k&&prime[i]*prime[i]<=n;i++) { ll sum=0; while(n%prime[i]==0) { n/=prime[i]; sum++; } if(prime[i]%2==1) { ans*=(sum+1); } } if(n>1&&n%2) { ans*=2; } printf("Case %d: %d",++u,ans-1); printf(" "); } }