本题我未卡数据,因此未AC,但主要写下思路。
链接:https://www.nowcoder.net/acm/contest/75/G
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数。
输入描述:
本题有多组输入 每行一个数n,1<=n<=10^18.
输出描述:
每行输出输出不是2 5 11 13的倍数的数共有多少。
示例1输入
15输出
4说明
1 3 7 9解题思路:
先分别求有多少是2、5、11、13的倍数,设分别有a、b、c、d个。
然后分别求有多少是10(2和5最小公倍数)、22(2和11最小公倍数)、26(2和13最小公倍数)、55(5和11最小公倍数)、65(5和13最小公倍数)、143(11和13)最小公倍数的倍数,设分别有e、f、g、h、i、j个。
再分别求有多少是110(2、5、11最小公倍数)、130(2、5、13最小公倍数)、715(5、11、13最小公倍数)、286(2、11、13最小公倍数)的倍数,设分别有k、l、m、n个。
再求有多少是1430(2、5、11、13最小公倍数)的倍数,设有o个,
最后,不是2、5、11、13的倍数的数字有:
[n-(a+b+c+d)+(e+f+g+h+i+j)-(k+l+m+n)+o]个代码如下:由于这里n属于【1,10^18】,数据溢出了,等我找到如何解决范围问题再来更新解决办法。package lanqiao; /* * * 链接:https://www.nowcoder.net/acm/contest/75/G * 来源:牛客网 题目描述 给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数。 输入描述: 本题有多组输入 每行一个数n,1<=n<=10^18. 输出描述: 每行输出输出不是2 5 11 13的倍数的数共有多少。 输入 15 输出 4 说明 1 3 7 9 */ import java.util.Scanner; public class G_problem { public static long num(long n,int a) { long b=0; for(long i=1;i<=n;i++) { if(i%a==0) { b=b+1; } } return b; } public static void main(String[] args) { // TODO Auto-generated method stub Scanner cin=new Scanner(System.in); long nn=cin.nextLong(); // long a,b,c,d; // long e,f,g,h,i,j; // long k,l,m,n; // long o; // a=b=c=d=e=f=g=h=i=j=k=l=m=n=o=0; int[] x= {2,5,11,13}; int[] y= {10,22,26,55,65,143}; int[] z= {110,130,725,286}; int[] h= {1430}; long sum=0,sum1=0,sum2=0,sum3=0; for(int i=0;i<x.length;i++) { sum+=num(nn,x[i]); } for(int i=0;i<y.length;i++) { sum1+=num(nn,y[i]); } for(int i=0;i<z.length;i++) { sum2+=num(nn,z[i]); } for(int i=0;i<h.length;i++) { sum3+=num(nn,h[i]); } // System.out.println(a+" "+b+" "+c+" "+d); System.out.println(nn-sum+sum1-sum2+sum3); } }
发现而这个数量也很有意思,1到num中整除c的数量正是num/c的值。因此也可这样写:不知道是哪里有问题没有ACpackage lanqiao; import java.util.Scanner; public class G_problem1 { public static void main(String[] args) { // TODO Auto-generated method stub long n,cnt; Scanner cin=new Scanner(System.in); n=cin.nextLong(); cnt=n-(n/2)-(n/5)-(n/11)-(n/13); cnt=cnt+(n/10)+(n/22)+(n/26)+(n/55)+(n/65)+(n/143); cnt=cnt-(n/110)-(n/130)-(n/715)-(n/286); cnt=cnt+(n/1430); System.out.println(cnt); } }
,我菜鸟一个
。