本文共 18517 字,大约阅读时间需要 61 分钟。
输入数据为T组(T <= 10000),每组数据读入一个n(n<=1000000000)
一行一个整数代表能获得的最大高兴值
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=0
ps:关于这题 数学不好就真的只能找规律了。 首先 关于查找n!中k的因子是有数学公式的:n!=n*(n-1)(n-2)……3*2*1=(k*2k*3k…..*mk)*a a是不含因子k的数的乘积,显然m=n/k;=(k^m)*(1*2*3…*m)*a=k^m*m!*a比如说例子代码:int gs(int n,int k){ int num=0; while(n) { num+=n/k; n/=k; } return num;}
下面给出AC代码:
1 #include2 using namespace std; 3 int main() 4 { 5 int T; 6 long long n,sum; 7 while(scanf("%d",&T)!=EOF) 8 { 9 while(T--)10 {11 sum=0;12 scanf("%lld",&n);13 while(n)14 {15 sum+=(n/2);16 n/=2;17 }18 printf("%lld\n",sum);19 }20 }21 return 0;22 }
Zhazhahe竟然能二到把耳机扔到洗衣机里去洗,真的是二到了一种程度,现在我们需要判断一下zhazhahe二的程度(就是计算zhazhahe的脑残值有几个2的因子),下面给你一个n,n!表示zhazhahe的脑残值。
输入一个正整数t(0<t<3000)表示样例组数,每组样例输入一个正整数n(0<n<1e18),n!表示zhazhahe的脑残值
输出一个正整数表示zhazhahe二的程度
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=1
题解:思路和上一题基本上是一样的,代码几乎相同!不理解看上一题的题解!
下面给出AC代码:
1 #include2 using namespace std; 3 int main() 4 { 5 int T; 6 long long n,ans,i,sum; 7 while(scanf("%d",&T)!=EOF) 8 { 9 while(T--)10 {11 scanf("%lld",&n);12 sum=0;13 while(n)14 {15 n/=2;16 sum+=n;17 }18 printf("%lld\n",sum);19 }20 }21 return 0;22 }
由于女生节准备到了,ming打算给班上女生送一份大礼。没错,就是数学练习册!
ming先前就已经收藏了 n 本练习册了,一直不舍得做,这次突然决定把它们都拿出来当作礼物送出去!但是,ming班上一共有 4 个女生,为了不要显得自己偏爱哪一个,他觉得每个女生都应该分到同等数量的练习册。这样的话,原来的 n 本就可能不太够了。于是他去逛亚马当商城。他发现,最近ACM(Association of Counting Method)又出版了好多新版数学练习册:高数、线代、离散、概率论…而且商店有三种促销优惠套餐:第一种:任选 1 本练习册,送欧几里德主题套尺。只需 a 个比特币;第二种:任选 2 本练习册,送莱布尼兹同款2B铅笔。只需 b 个比特币;第三种:任选 3 本练习册,送爱因思坦专用橡皮擦。只需 c 个比特币。那么问题来了:吃土ming如何用最少的比特币购买若干本练习册,使得全部(包括原来的n本)可以平分给四个女生?
每组输入是一行四个整数:n,a,b,c(1 <= n,a,b,c <= 1e9)意思如题目描述。
对每组输入,输出一行一个整数,表示ming要花的最少的比特币数。
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=2
思路:三种情况,讨论即可!给出两种写法:
1 #include2 #define ll long long int 3 using namespace std; 4 int main() 5 { 6 ll t; 7 scanf("%lld",&t); 8 while(t--) 9 {10 ll n,a,b,c;11 scanf("%lld%lld%lld%lld",&n,&a,&b,&c);12 if(n%4==0)13 printf("0\n");14 else15 {16 ll x=(4-(n%4));17 if(x==1)printf("%lld\n",min(min(a,c*3),c+b));18 if(x==2)printf("%lld\n",min(min(2*a,b),c*2));19 if(x==3)printf("%lld\n",min(min(3*a,a+b),c));20 }21 }22 return 0;23 }
DP写法:
1 #include2 using namespace std; 3 long long dp[30]; 4 const long long inf=1<<30; 5 void init(int x) 6 { 7 for(int i=1;i<=24;i++) 8 dp[i]=i?inf:0; 9 }10 int main()11 {12 int m[4];13 int T,n,x;14 while(scanf("%d",&T)!=EOF)15 {16 while(T--)17 {18 scanf("%d",&n);19 for(int i=1;i<=3;i++)20 scanf("%d",&m[i]);21 x=n%4;22 if(!x)23 cout<<0< =j)30 dp[i]=min(dp[i],dp[i-j]+m[j]);31 long long minx=inf;32 for(int j=1;j<=3;j++)33 minx=min(minx,dp[j*4-x]);34 printf("%lld\n",minx);35 }36 }37 }38 return 0;39 }
涟漪进入集训队后,他会去实验室训练或者去操场锻炼。 接下来n天,每天的情况是一下4种中的一种: 1.当天体育馆关门了和没有训练赛 2.当天体育馆关门了和有训练赛 3.当天体育馆开放和没有训练赛 4.当天体育馆开放和有训练赛 涟漪知道之后n天的情况。 涟漪每一天可以休息,或者打训练赛(当天有训练赛)或者运动(当天体育馆开放)。 涟漪要制定一个训练计划,决定每天干什么,但是涟漪不会连续两天都运动或者连续两天都打训练赛, 请帮涟漪找出她最少休息的天数(她不打训练赛和运动)。 休息的时候,她会做下面的数学题
输出 一个数 表示(涟漪休息的天数) 乘以(数学题的答案的积)。
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=3
分析:四次导数,结果为-24,注意这个好像没有什么了!
下面给出AC代码:
1 #include2 using namespace std; 3 const int MAX=105; 4 int n,a[MAX]; 5 int main() 6 { 7 int T; 8 cin>>T; 9 while(T--)10 {11 scanf("%d",&n);12 for(int i=1;i<=n;i++) scanf("%d",&a[i]);13 int l=1;14 while(a[l]==3) l++;15 for(int i=l+1;i<=n;i++)16 {17 if(a[i]==3)18 {19 if(a[i-1]!=3) a[i]=3-a[i-1];20 }21 else 22 {23 if(a[i]==a[i-1]) a[i]=0;24 }25 }26 int ans=0;27 for(int i=1;i<=n;i++)28 {29 if(!a[i]) ans++;30 }31 cout< <
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=4
思路:
1 #include2 using namespace std; 3 const int N=100000+10; 4 struct zxc 5 { 6 int xx,mm; 7 } a[N]; 8 bool cmp(struct zxc x,struct zxc y) 9 {10 return x.mm >t;16 while(t--)17 {18 int n,i,j;19 cin>>n;20 for(i=1; i<=n; i++)21 {22 a[i].xx=i;//记录原先所在的位置23 cin>>a[i].mm;24 }25 stable_sort(a+1,a+n+1,cmp);//稳定排序26 int tot=0;27 i=1;28 while(i<=n)29 {30 tot++;31 int k=a[i].xx;32 for(j=i; j<=k; j++)//相交的区间合并33 if(a[j].xx>k)34 k=a[j].xx;35 i=k+1;36 }37 cout< < <
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=5
思路:这道题就不说了,输出ab!
下面给出AC代码:
1 #include2 using namespace std;3 int main()4 {5 cout<<'a'<<'b'<
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=6
思路:一个组合问题,求C(n,k);
下面给出AC代码:
1 #include2 using namespace std; 3 int main() 4 { 5 int n,k; 6 while(~scanf("%d%d",&n,&k)) 7 { 8 int a=1,b=1,c=1;//一定要赋值1; 9 for(int i=n;i>=1; i--)10 a*=i;11 for(int i=k; i>=1; i--)12 b*=i;13 for(int i=(n-k); i>=1; i--)14 c*=i;15 printf("%d\n",a/(b*c));16 }17 return 0;18 }
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=7
思路:
Single number 问题,其他数都出现了k(k>1)次,只有一个数出现了一次,求这个数。
考虑把出现了多次数消掉,如果k是偶数,则可用异或法;如果k是奇数,则可以用求和再求余法,出现k次的数模k为0,和里最终剩下的是那个single number %k,还是不行,再利用一个性质,小于k的数对k取模就是这个数本身,分别求single number的每一位1 #include2 #include 3 using namespace std; 4 unsigned long long FindFirstBitIs1 (long long num){ 5 long long indexBit = 0; 6 while ((num & 1) == 0 && indexBit < 32){ 7 num >>= 1; 8 ++indexBit; 9 }10 return indexBit;11 }12 13 long long IsBit1 (long long data, unsigned long long indexof1){14 data >>= indexof1;15 return data & 1;16 }17 18 void FindNumsAppearOnce (long long data[], long long n, long long &num1, long long &num2){19 long long result = 0;20 long long i;21 for (i=0; i >T;38 while(T--){39 long long num1 = 0,num2 = 0;40 long long n;41 scanf("%lld",&n);42 long long *a=new long long[n];43 for(long long i=0;i
听说ACM新生杯来了许多大佬,吓得只会做水题的jiakin开始做水题。 题目在一个n行m列二维网格中,位于右下角的格子。现在有若干种水管,类型及状态如下:
在网格中有一些格子布置着水管(只有一种类型一种状态),现在jiakin从最左上的格子开始灌水(即最左上的格子一直有水),且水只能沿水管向右或者向下流,问:jiakin能否成功做好水题。(如图:满足条件)
第一行一个整数T(T < 10),代表T组测试数据。 每组数据第一行有两个整数n和m(n,m<=1000),表示网格的行数和列数。 接下去n行,每行有m个格式为(x,y)的一组数据,代表水管的类型和状态,其中(0,0)表示没水管。
对每组数据第一行“Case x:”,x代表第x组数据。 第二行如果jiakin能成功水题则输出“Well done!”,否则输出“What a pity!”.
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=8
思路:只要理顺就好了!
下面给出AC代码:
1 #include2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 struct node{ 9 int x,y; 10 }g[1111][1111]; 11 12 bool f[1111][1111]; 13 14 int main(){ 15 freopen("input.txt","r",stdin); 16 int T,n,m; 17 scanf("%d\n",&T); 18 for(int cnt=1;cnt<=T;cnt++){ 19 scanf("%d %d\n",&n,&m); 20 for(int i=1;i<=n;i++){ 21 for(int j=1;j<=m;j++)scanf("(%d,%d)",&g[i][j].x,&g[i][j].y); 22 getchar(); 23 } 24 memset(f,0,sizeof f); 25 f[1][1]=1; 26 for(int i=1;i<=n;i++) 27 for(int j=1;j<=n;j++){ 28 if(i==1&&j==1) continue; 29 if(g[i][j].x==2&&g[i][j].y==4){ //2 4 30 f[i][j]=0; 31 continue; 32 } 33 if(g[i][j].x==2&&g[i][j].y==5){ //2 5 34 f[i][j]=0; 35 continue; 36 } 37 38 if(g[i][j].x==2&&g[i][j].y==0&& 39 ((g[i][j-1].x==2&&g[i][j-1].y==3) 40 ||(g[i][j-1].x==3&&g[i][j-1].y==0) 41 ||(g[i][j-1].x==3&&g[i][j-1].y==2) 42 ||(g[i][j-1].x==3&&g[i][j-1].y==3) 43 ||(g[i][j-1].x==4&&g[i][j-1].y==0))) f[i][j]=f[i][j-1]; //(2,0) 44 45 if(g[i][j].x==2&&g[i][j].y==1&& 46 ((g[i-1][j].x==2&&g[i-1][j].y==2) 47 ||(g[i-1][j].x==3&&g[i-1][j].y==0) 48 ||(g[i-1][j].x==2&&g[i-1][j].y==1) 49 ||(g[i-1][j].x==3&&g[i-1][j].y==1) 50 ||(g[i-1][j].x==4&&g[i-1][j].y==0) 51 ||(g[i-1][j].x==3&&g[i-1][j].y==3))) f[i][j]=f[i-1][j]; //(2,1) 52 53 if(g[i][j].x==2&&g[i][j].y==2&& 54 ((g[i][j-1].x==2&&g[i][j-1].y==3) 55 ||(g[i][j-1].x==3&&g[i][j-1].y==0) 56 ||(g[i][j-1].x==3&&g[i][j-1].y==2) 57 ||(g[i][j-1].x==3&&g[i][j-1].y==3) 58 ||(g[i][j-1].x==4&&g[i][j-1].y==0))) f[i][j]=f[i][j-1]; //(2,2) 59 60 if(g[i][j].x==2&&g[i][j].y==3&& 61 ((g[i-1][j].x==2&&g[i-1][j].y==2) 62 ||(g[i-1][j].x==3&&g[i-1][j].y==0) 63 ||(g[i-1][j].x==2&&g[i-1][j].y==1) 64 ||(g[i-1][j].x==3&&g[i-1][j].y==1) 65 ||(g[i-1][j].x==4&&g[i-1][j].y==0) 66 ||(g[i-1][j].x==3&&g[i-1][j].y==3))) f[i][j]=f[i-1][j]; //(2,3) 67 68 if(g[i][j].x==3&&g[i][j].y==0&& 69 ((g[i][j-1].x==2&&g[i][j-1].y==3) 70 ||(g[i][j-1].x==3&&g[i][j-1].y==0) 71 ||(g[i][j-1].x==3&&g[i][j-1].y==2) 72 ||(g[i][j-1].x==3&&g[i][j-1].y==3) 73 ||(g[i][j-1].x==4&&g[i][j-1].y==0))) f[i][j]=f[i][j-1]; //(3,0) 74 75 if(g[i][j].x==3&&g[i][j].y==3&& 76 ((g[i-1][j].x==2&&g[i-1][j].y==2) 77 ||(g[i-1][j].x==3&&g[i-1][j].y==0) 78 ||(g[i-1][j].x==2&&g[i-1][j].y==1) 79 ||(g[i-1][j].x==3&&g[i-1][j].y==1) 80 ||(g[i-1][j].x==4&&g[i-1][j].y==0) 81 ||(g[i-1][j].x==3&&g[i-1][j].y==3))) f[i][j]=f[i-1][j]; //(3,3) 82 83 if(g[i][j].x==3&&g[i][j].y==1){ 84 if((g[i-1][j].x==2&&g[i-1][j].y==2) 85 ||(g[i-1][j].x==3&&g[i-1][j].y==0) 86 ||(g[i-1][j].x==2&&g[i-1][j].y==1) 87 ||(g[i-1][j].x==3&&g[i-1][j].y==1) 88 ||(g[i-1][j].x==4&&g[i-1][j].y==0) 89 ||(g[i-1][j].x==3&&g[i-1][j].y==3)) f[i][j]=f[i-1][j]; 90 if(f[i][j]) continue; 91 if((g[i][j-1].x==2&&g[i][j-1].y==3) 92 ||(g[i][j-1].x==3&&g[i][j-1].y==0) 93 ||(g[i][j-1].x==3&&g[i][j-1].y==2) 94 ||(g[i][j-1].x==3&&g[i][j-1].y==3) 95 ||(g[i][j-1].x==4&&g[i][j-1].y==0)) f[i][j]=f[i][j-1]; 96 } 97 if(g[i][j].x==3&&g[i][j].y==2){ 98 if((g[i-1][j].x==2&&g[i-1][j].y==2) 99 ||(g[i-1][j].x==3&&g[i-1][j].y==0)100 ||(g[i-1][j].x==2&&g[i-1][j].y==1)101 ||(g[i-1][j].x==3&&g[i-1][j].y==1)102 ||(g[i-1][j].x==4&&g[i-1][j].y==0)103 ||(g[i-1][j].x==3&&g[i-1][j].y==3)) f[i][j]=f[i-1][j];104 if(f[i][j]) continue;105 if((g[i][j-1].x==2&&g[i][j-1].y==3)106 ||(g[i][j-1].x==3&&g[i][j-1].y==0)107 ||(g[i][j-1].x==3&&g[i][j-1].y==2)108 ||(g[i][j-1].x==3&&g[i][j-1].y==3)109 ||(g[i][j-1].x==4&&g[i][j-1].y==0)) f[i][j]=f[i][j-1]; 110 }111 if(g[i][j].x==4&&g[i][j].y==0){112 if((g[i-1][j].x==2&&g[i-1][j].y==2)113 ||(g[i-1][j].x==3&&g[i-1][j].y==0)114 ||(g[i-1][j].x==2&&g[i-1][j].y==1)115 ||(g[i-1][j].x==3&&g[i-1][j].y==1)116 ||(g[i-1][j].x==4&&g[i-1][j].y==0)117 ||(g[i-1][j].x==3&&g[i-1][j].y==3)) f[i][j]=f[i-1][j];118 if(f[i][j]) continue;119 if((g[i][j-1].x==2&&g[i][j-1].y==3)120 ||(g[i][j-1].x==3&&g[i][j-1].y==0)121 ||(g[i][j-1].x==3&&g[i][j-1].y==2)122 ||(g[i][j-1].x==3&&g[i][j-1].y==3)123 ||(g[i][j-1].x==4&&g[i][j-1].y==0)) f[i][j]=f[i][j-1];124 }125 }126 if(f[n][m]){127 printf("Case %d:\n",cnt);128 puts("Well done!");129 }130 else{131 printf("Case %d:\n",cnt);132 puts("What a pity!");133 }134 }135 136 return 0;137 }
小z很喜欢研究各种各样的数字,最近他迷上了质数和平方数,他把一个质数的平方命名为”质方数”,现在他想知道,给出一个正整数,距离这个正整数最近的质方数是什么?(如果有2个距离相等的质方数,选择较小的一个)
输入数据组数为T(T<=50),每组数据输入一个正整数n,其中1<=n<=100,000,000;
对于每个测试样例,输出距离最近的质方数,每个样例占一行。
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=9
思路:打表吧!之前也不知道懵了哪里,怎么都不会过,还有这道题很坑,官方数据都是有问题的!我只能膜拜出题君了!
下面给出AC代码:
1 #include2 using namespace std; 3 bool gcd(int n) 4 { 5 if(n==2) 6 return true; 7 else 8 { 9 for(int i=2;i<=sqrt((double)n);i++)10 if(n%i==0)11 return false;12 }13 return true;14 }15 int main()16 {17 int T,n;18 while(scanf("%d",&T)!=EOF)19 {20 while(T--)21 {22 scanf("%d",&n);23 int count1,count2;24 int c;25 if(n==0)26 cout<<4< =2)30 {31 int x=n;32 int y=n;33 while(x--)34 if(gcd(x))35 {36 count1=n-x;37 break;38 }39 while(y++)40 if(gcd(y))41 {42 count2=y-n;43 break;44 }45 if(count1<=count2)46 {47 n=x;48 c=count1;49 }50 else51 {52 n=y;53 c=count2;54 }55 cout< <
转载地址:http://xzbva.baihongyu.com/