hunnu--11550--欧拉函数

欧拉函数
Time Limit: 3000ms, Special Time Limit:6000ms, Memory Limit:65536KB
Total submit users: 73, Accepted users: 59
Problem 11550 : No special judgement
Problem description
  一个数x的欧拉函数Φ(x)定义为所有小于x的正整数中与x互质的数的数目,如小于5且和5互质的数有1、2、3、4,一共4个,故Φ(5)=4。

对于任意正整数x,我们定义两种操作: 
1、f(x) = x + Φ(x);
2、g(x) = x * Φ(x);

现在,给定一个数a,问从1开始,需要多少步操作能得到a。
(如,当a = 2时,f(1)即为所求,故答案为1,而当a = 3时,f(f(1))即为所求,故答案为2) 

Input
  每行输入一个整数a(0<a<=100000)。 
Output
  输出需要的步数,如果无法得到,输出-1;
Sample Input
2
3
Sample Output
1
2
Problem Source
  HUNNU Contest 

如果你不知道求欧拉函数的话那么这题还是不要看了,就像我一样~~

打欧拉表的是网上找的,我自己写的只有下面的dp

#include <cstdio>
#include <cstring>
#include <iostream>
#include <malloc.h>
#define LL long long
using namespace std;
const LL N = 100001;
LL n;
LL *phi,i,j;
    char *prime;
LL flog;
LL visit[N];
LL dp[N],num[N];
int main()
{
    prime=(char*)malloc((N+1)*sizeof(char));

    prime[0]=prime[1]=0;
    for(i=2; i<N; i++)
        prime[i]=1;
    for(i=2; i*i<N; i++)
    {
        if(prime[i])
        {
            for(j=i*i; j<=N; j+=i)
            {
                prime[j]=0;
            }
        }
    } //这段求出了N内的所有素数
    phi=(LL*)malloc((N+1)*sizeof(LL));
    for(i=1; i<N; i++)
    {
        dp[i]=N;//dp初始化
        phi[i]=i;
    }
    for(i=2; i<N; i++)
    {
        if(prime[i])
        {
            for(j=i; j<N; j+=i)
            {
                phi[j]=phi[j]/i*(i-1); //此处注意先/i再*(i-1),否则范围较大时会溢出
            }
        }
    }//以上都是打表部分,表示没细心去看,导致连注释都懒得改了,原创大哥看到了别喷我~
    dp[1]=0;
    //dp的递推思路就是用小点推出大点,因为上面两个公式是递增的,所以从小到大来遍历的话,每次遍历到的点都是已经求出了最优方案的
    for(i=1;i<N;i++)
    {
        if(i+phi[i]<N&&dp[i+phi[i]]>dp[i]+1)//用公式1如果没有过界,同时当前方案用的步数更少,那么替换
        dp[i+phi[i]]=dp[i]+1;
        if(i*phi[i]<N&&dp[i*phi[i]]>dp[i]+1)//用公式2如果没有过界,同时当前方案用的步数更少,那么替换
        dp[i*phi[i]]=dp[i]+1;
    }

    while(scanf("%lld",&n)!=-1)
    {
        if(dp[n]<N)//因为dp初始化就是N,所以这一步不能少。
            printf("%lld\n",dp[n]);
        else
            printf("-1\n");
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
if __name__ == '__main__': # -------------Adjustable global parameters---------- n=512 # pixel number m=10 # number of time phases angle = 5 # #sample points = 360/angle on the boundary numOfAngles = int(180/angle) numOfContourPts = int(360/angle) labelID = 1 # 勾画的RS文件中第几个轮廓为GTV # path of the input data folder = 'E:\\MedData\\4DCT-202305\\' #patient = '0007921948' # 缺少时间信息 patient = '0000726380' # 病人的编号 # 呼吸曲线数据文件 vxpPath = folder+patient+'\\0000726380\\0000726380_20230420_143723.vxp' # Save the generated figures to the latex file path figPath = "D:\\HUNNU\\Research\\DMD\\4D-CT\\latex-DMD插\\modify202305\\figure\\" # -------------Auto generated global parameters---------- # 每个dicom文件包含多少横截面 name = os.listdir(folder+patient+'\\0') cuts = [] for i in range(len(name)): if 'CT' in name[i][0:2]: cuts.append(i+1) cuts = np.array(cuts) # phase name times = np.linspace(0,90,10) # image pixel coordinate nums = np.linspace(0,n-1,n) x,y = np.meshgrid(nums,nums) # 输出dicom头文件信息 filename = folder+patient+'\\0\\CT.{}'.format(patient)+'.Image 1.dcm' print('CT dicom file information:') info = loadFileInformation(filename) # 像素之间的间距,包括列间距和行间距,单位mm SliceThickness = info['SliceThickness'] # Z轴的扫描分辨率,单位mm pixelSpace = info['pixelSpace'] # 一个像素所占的实际体积 pixelVol = float(pixelSpace[0])*float(pixelSpace[0])*float(SliceThickness) print('sliceThickness=',SliceThickness,' pixelSpace=',pixelSpace)
最新发布
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值