Trailing Zeroes (I) LightOJ - 1028(求因子个数)
题意:
给出一个N 求N有多少个别的进制的数有后导零
解析:
对于一个别的进制的数要转化为10进制 (我们暂且只分析二进制就好啦)
An * 2^(n-1) + An-1 * 2^(n-2) + ``````+ A1 * 2^1 + A0 * 2^0 = N
因为有后导零 我们暂且只看有一个后导零的情况 即A0 = 0
那么 2 * ( An * 2^(n-2) + An01 * 2^(n-3) + `````` + A1) = N
即 An * 2^(n-2) + An-1 * 2^(n-3) + `````` + A1 = N/2
把2替换为x进制 且 左边设为M
则 M = N / x
所以M的个数即为N的因子的个数
用算术基本定理求因子个数即可
最后还要减1呀!
懒得打代码了。。。。代码原文地址:https://blog.csdn.net/zyz_3_14159/article/details/52824900
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> using namespace std; typedef long long ll; bool vis[1000010]; int prime[1000010],cnt; void getprime() { cnt=0; int i,j; for(i=2;i<=1000000;i++) { if(!vis[i]) prime[cnt++]=i; for(j=2*i;j<=1000000;j+=i) vis[j]=1; } } ll fun(ll n) { ll ans=1; int num,i; for(i=0;i<cnt&&prime[i]*prime[i]<=n;i++) { if(n%prime[i]==0) { num=0; while(n%prime[i]==0) { num++; n/=prime[i]; } ans*=(num+1); } } if(n>1) ans*=2; return ans-1; } int main() { int cas,c; ll n; getprime(); scanf("%d",&cas); for(c=1;c<=cas;c++) { scanf("%lld",&n); if(n!=1) printf("Case %d: %lld\n",c,fun(n)); else printf("Case %d: 0\n",c); } return 0; }
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。