杭州网站建设电话,网页字体尺寸设计,网络游戏工作室加盟,开封网站建设培训学校要找到和为给定值的所有的等比数列.
1肯定是要特判一下.
我的想法是先找到所有等比为1的,等比为1就是将这个数分为相同的一些数,总共就是这个数的所有约数个数减一(有一个约数为1,题目要求至少分成两个数).
对于其他的等比不为1 的,用等比数列的求和公式暴力一发就行了.
#i…要找到和为给定值的所有的等比数列.
1肯定是要特判一下.
我的想法是先找到所有等比为1的,等比为1就是将这个数分为相同的一些数,总共就是这个数的所有约数个数减一(有一个约数为1,题目要求至少分成两个数).
对于其他的等比不为1 的,用等比数列的求和公式暴力一发就行了.
#includecstdio
#includecstring
#includecmathusing namespace std;typedef long long ll;
const int MAXN1e55;
int prime[MAXN];
int check[MAXN];
int tot0;
ll n;
ll ans;void creat_prime()
{for(int i2;iMAXN;i){if(!check[i]) prime[tot]i;for(int j0;jtot prime[j]*iMAXN;j){check[i*prime[j]]true;if(i%prime[j]0) break;}}
}void init()
{ans1;ll mn;for(int i0;itot;i){int tmp0;while(m%prime[i]0){tmp;m/prime[i];} ans*(tmp1);if(m1) break;}ans--;
}ll quick_pow(ll a,ll b)
{ll ret1;while(b){if(b1) ret*a;b1; a*a;}return ret;
}int main()
{//printf(%lld,quick_pow(2,10));creat_prime();while(~scanf(%I64d,n)){if(n1){ans0;printf(%I64d\n,ans);continue;}init();for(int i2;in;i){for(int j2;jn;j){ll tmp(quick_pow(i,j)-1)/(i-1);if(tmpn) break;if(n%tmp0){ans;}}}printf(%I64d\n,ans);} }