LightOJ 1028 Trailing Zeroes (I)

本文详细解析了LightOJ 1028题目的解题思路及算法实现,通过将给定的十进制数转换为不同进制数并判断其是否符合条件来计算可能的进制数量。

题目链接 http://lightoj.com/volume_showproblem.php?problem=1028

题意:给你一个十进制的数N,把它转化成一个任意进制的数M,并且M的最后一位为0(M为[2,inf)的任意进制),问存在多少种这样的进制。

思路:如果N 转化成x进制符合题目给出的条件,则N=an*x^n+an-1*x^n-1+...+a1*x^n=x*(an*x^n-1+an-1*x^n-2+...a1),a0=0.
问题转化为求N的约数个数。

代码最后给出了一组测试数据,注意N=1的情况。

#include <stdio.h>

const int NUM=1000004;
int prime[80000];
int Num_Prime=0;
bool visit[NUM];

__int64 n;

void Prime ()           //素数打表prime数组从1开始,范围内最大1000003
{
    for (int i=2;i<NUM;i++) if (visit[i] == false)
    {   
		prime[++Num_Prime]=i;
        for (int j=i+i;j<NUM;j+=i)
            visit[j]=true;
    }
}

void Deal ()
{
    __int64 ans=1;
    int t,id=0;
    for (int i=1;i<=Num_Prime && prime[i]*prime[i] <= n;i++)
		if(n%prime[i] == 0)
		{
			t=0;
			while (n%prime[i] == 0)
			{
				t++;
				n/=prime[i];
			}
			ans*=(1+t);
		}
    if (n>1)                 //说明n在被处理后留下了大于1000003的素数
        ans*=2;
    if (ans!=1)              //如果n为合数
        printf("%lld\n",ans-1);
    else                     //如果n为素数
        printf("1\n");
}

int main ()
{
    int T;
    scanf("%d",&T);
    Prime ();  
    for (int cas=1;cas<=T;cas++)
    {
        scanf ("%lld",&n);                   //vc6.0编译需改为I64d
        printf("Case %d: ",cas);
        if (n == 1)
            printf("0\n");
        else
			Deal ();  
    }
    return 0;
}

/*
3
2592
932832498273
1

Out:
Case 1: 29
Case 2: 31
Case 3: 0
  
932832498273=3*13*41*317*1840331
*/

2013/4/20 补充:把求约数个数的函数写成了一个类,详见代码

#include <cstdio>
#include <algorithm>
using namespace std;

class Num_divisors
{
private:

	bool visit[1000004];
	int NUM;
	__int64 Deal (__int64 n)
	{
		__int64 ans=1;
		int t,id=0;
		for (int i=1;i<=Num_Prime && prime[i]*prime[i] <= n;i++)
			if(n%prime[i] == 0)
			{
				t=0;
				while (n%prime[i] == 0)
				{
					t++;
					n/=prime[i];
				}
				ans*=(1+t);
			}
		if (n>1)                 //说明n在被处理后留下了大于1000003的素数
			ans*=2;
		if (ans!=1)              //如果n为合数
			return ans-1;
		else                     //如果n为素数
			return 1;
	}

public:

	int prime[80000];
	int Num_Prime;
	Num_divisors ()
	{
		Num_Prime=0;
		NUM=1000004;
		Prime ();
	}

	void Prime ()   //素数打表prime数组从1开始,范围内最大1000003
	{
		for (int i=2;i<NUM;i++) if (visit[i] == false)
		{
			prime[++Num_Prime]=i;
			for (int j=i+i;j<NUM;j+=i)
				visit[j]=true;
		}
	}

	__int64 Cal_true (__int64 n)  //1-10^12内任意一个数约数的个数,不包括自己
	{
		if (n==1)
			return 1;
		return Deal (n);
	}

	__int64 Cal (__int64 n)  //1-10^12内任意一个数约数的个数,包括自己
	{
		if (n==1)
			return 1;
		return Deal (n)+1;
	}
}ob;

int main ()  
{
    int T;  
	__int64 n;
    scanf("%d",&T);  
    for (int cas=1;cas<=T;cas++)  
    {
        scanf ("%lld",&n);
        printf("Case %d: ",cas);  
        if (n == 1)  
            printf("0\n");  
        else  
            printf("%lld\n",ob.Cal_true(n)); 
    }  
    return 0;
}


【源码免费下载链接】:https://renmaiwang.cn/s/3r450 支持向量机(Support Vector Machines,SVM)是机器学习领域一种强大的监督学习算法,尤其在分类和回归问题上表现出色。本章聚焦于通过Python 3.7实现支持向量机,提供详尽的代码注解,帮助读者深入理解其工作原理。一、支持向量机基本概念支持向量机的核心思想是找到一个最优超平面,该超平面能够最大程度地将不同类别的数据分开。超平面是特征空间中的一个决策边界,它由距离最近的训练样本(即支持向量)决定。SVM的目标是最大化这些最接近样本的距离,也就是所谓的间隔。二、SVM的两种类型1. 线性SVM:当数据线性可分时,SVM可以找到一个线性超平面进行分类。2. 非线性SVM:通过核函数(如高斯核、多项式核等)将低维非线性数据映射到高维空间,从而在高维中找到一个线性超平面进行分类。三、SVM的主要组成部分1. 决策函数:SVM使用超平面作为决策边界,形式为`w·x+b=0`,其中`w`是超平面的法向量,`b`是偏置项。2. 支持向量:位于最近间隔边缘的数据点,对超平面的位置至关重要。3. 软间隔:允许一部分样本落在决策边界内,通过惩罚项C控制误分类的程度。4. 核函数:用于实现非线性分类,如高斯核(RBF,Radial Basis Function):`K(x, y) = exp(-γ||x-y||^2)`,其中γ是调整核函数宽度的参数。四、Python实现SVM在Python中,我们可以使用Scikit-Learn库来实现SVM。Scikit-Learn提供了多种SVM模型,如`svm.SVC`(用于分类)、`svm.LinearSVC`(仅线性分类)和`svm.NuSVC`(nu版本的SVM,支持类别不平衡问题)。五、SVM的训练与预测流程1. 数据预处理:将数据归一化或标准化,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值