有一天, 我们帅气的LC来到加玛帝国. 有时候, 缘分就是这么奇怪, LC和加玛帝国的公主一见钟情, 奈何公主的父王不同意, 因为他觉得LC除了长得特别帅之外, 并没有一技之长.
LC对此呵呵一笑, 他说, 我可是创新实验室走出来的学生, 我会的技能可多着呢, 先说个简单的吧, 只要你给我任意一串字符串, 我就能立马算出这串字符串当中最长回文串的长度. 国王很是吃惊, 说要考一考LC.
于是国王想让你帮忙写一个程序, 用来比对LC的答案, 快来帮帮国王吧!
有一天, 我们帅气的LC来到加玛帝国. 有时候, 缘分就是这么奇怪, LC和加玛帝国的公主一见钟情, 奈何公主的父王不同意, 因为他觉得LC除了长得特别帅之外, 并没有一技之长.
LC对此呵呵一笑, 他说, 我可是创新实验室走出来的学生, 我会的技能可多着呢, 先说个简单的吧, 只要你给我任意一串字符串, 我就能立马算出这串字符串当中最长回文串的长度. 国王很是吃惊, 说要考一考LC.
于是国王想让你帮忙写一个程序, 用来比对LC的答案, 快来帮帮国王吧!
第一行输入一个T(T <= 50), 表示一共有T组测试数据. 接下来T行, 每行为一组由小写字母组成, 长度不超过10^5的字符串.
每行一个整数X, 表示该组字符串中所包含的最长回文长度.
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<vector> #define mem(x,y) memset(x,y,sizeof(x)) using namespace std; typedef long long LL; const int INF = 0x3f3f3f3f; const int MAXN = 200100; int p[MAXN]; char str[MAXN],s[MAXN]; int Manacher(char *s,int len){ mem(p,0); p[0] = p[1] = 1; int id = 1,mx = 1; int ans=0; for(int i = 2;i < len; i++){ if(mx>i) p[i]=min(p[2*id-i],mx-i); else p[i]=1; while(s[i-p[i]] == s[i+p[i]]) p[i]++; if(p[i] + i > mx)mx = p[i] + i,id = i; ans = max(ans,p[i]); } return ans - 1; } int main(){ int T; scanf("%d", &T); while(T--){ scanf("%s",str); int len = strlen(str); s[0]='@'; for(int i = 0; i < len; i++){ s[2*i + 1] = '#'; s[2*i + 2] = str[i]; } s[2 * len + 1] = '#'; printf("%d\n", Manacher(s, 2*len + 2)); } return 0; }
有一天,有一个小朋友送给萌萌的韬韬一本书,书的名字叫做《数》,韬韬对于数字有着无比的狂热,一拿到这本书就沉迷于数的世界无法自拔,不久韬韬看到一个数字被称为神の数字——36,觉得很好奇,从未听说过,又继续往下看,发现原来36好厉害呢,有好多神奇的性质。
36 = (1 + 3 + 5 +7) + (2 + 4 + 6 + 8) 是前4个奇数与前4个偶数的和
36 = 1^3+2^3+3^3 还是前3个自然数的立方和
《三十六计》是一个神奇的东西,可以解决好多神奇的问题,是杰出的军事家孙子大大写就的一篇传世巨擘。
人体能承受的安全电压是36V,好巧耶。
… …
韬韬看到了这么多36的神奇性质,想到了一个问题,给定区间范围[l, r]内有多少跟36相关的数呢,韬韬在想什么样的数是和36相关的呢,换句话说,韬韬在思考如何给“36相关的数”一个定义。
一个“36相关的数”,首先它的十进制表示中必须得有36吧,嘛,相关度还得够,一定不能有单个的3或者6,单个的3或6不是真的36呀。36036是一个“36相关的数”,而36633不是呢。好像漏掉了什么东西,“这还不够”,韬韬说道。
一个“36相关的数”,它必须能被36整除,这才是真的和36相关嘛,韬韬发现在[1, 36]区间中只有36这个数满足这些要求。韬韬想知道第二个这样的数是多少呢,很遗憾,貌似100以内找不到这样的数了呢。
韬韬非常沮丧,他热切地想知道区间[l, r]中“36相关的数”有多少。好像又漏掉了点什么呢,韬韬还想知道[l, r]区间中这些36相关数中有多少“36”存在,毕竟是36嘛。
既然韬韬现在很沮丧,一点算数的心情都没有了,但是他很想知道上面提到的这些数呢,亲爱的小伙伴你可以帮帮他嘛?
第一行是测试样例数 t (1 <= t <= 10^5) 接下来t行每行包括两个正整数 l, r (1 <= l <= r <= 10^5).
输出包括t行,每行对应一次询问,每行包括2个数 — 区间[l, r]中36相关数的数量, 36相关数中“36”的数量。
[1, 3636]中36相关数有36, 360, 936,1368, 1836, 2736, 3600, 3636这8个, “36”出现了9次
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int MAXN = 1e5 + 100; int d1[MAXN],d2[MAXN]; void find(int x, int &n1, int &n2){ n1 = 0; n2 = 0; // int p = x; while(x){ if(x % 100 == 36){ n1++; n2++; x /= 100; continue; } else if(x % 10 == 3 || x % 10 == 6){ n1 = 0;n2 = 0; return; } x /= 10; } if(n1 > 1)n1 = 1; //if(n1)printf("%d\n",p); } int main(){ int T, l, r; memset(d1,0,sizeof(d1)); memset(d2,0,sizeof(d2)); for(int i = 36;i < MAXN; i++){ int n1 = 0,n2 = 0; if(i % 36 == 0)find(i,n1,n2); d1[i] = d1[i - 1] + n1; d2[i] = d2[i - 1] + n2; } scanf("%d",&T); while(T--){ scanf("%d%d",&l,&r); printf("%d %d\n",d1[r] - d1[l - 1], d2[r] - d2[l - 1]); } return 0; }
最近韬韬周围的小伙伴们都在玩炉石传说, 感觉好厉害的样子, 可是韬韬早都不玩游戏了呢, 自从入坑ACM之后。“不能没有我的蜡烛”, 韬韬天天都能听到这样的句子 - -
听说炉石传说开放了新冒险模式——探险者协会!开放了一种新的技能:“发现”!
它的效果是提供三张卡牌(随从卡 / 法术卡), 你可以获得任意一张, 并丢掉另外两张。
现在你可以使用 n 次“发现”技能, 当然到最后你会得到 n 张卡牌, 如今已经给出每次使用技能后可以选择的三张卡的属性, 韬韬很想知道能否获得至少 a 张随从卡以及 b 张法术卡。
亲爱的小伙伴你可以帮帮韬韬嘛?
第一行是测试样例数t (1 <= t <= 1000) 每组输入数据的第一行是三个正整数 n, a, b含义见上述 数据范围1 <= n <= 1000 , 1 <= a, b <= n 接下来 n 行, 每行三个数(0或1), 0代表随从卡, 1代表法术卡
对于每组数据, 输出一行 YES 或者 NO
对于第一组样例, n=1,a=1, b=0, 使用1次“发现”技能, 至少获得1张随从卡.由于提供的3张都是法术卡(3个1), 所以不能达到要求
对于第二组样例, n=3,a=1, b=2, 使用3次“发现”技能, 至少获得1张随从卡, 2张法术卡. 那么只要在第一次和第三次选法术卡, 第二次选随从卡即可
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int INF = 0x3f3f3f3f; int main(){ int T, n, a, b; scanf("%d",&T); while(T--){ int na = 0,nb = 0,nc = 0; scanf("%d%d%d",&n, &a, &b); int x,y,z; for(int i = 0; i < n; i++){ scanf("%d%d%d",&x,&y,&z); if(x == y && x == z && x == 0) na++; else if(x == y && x == z && x == 1) nb++; else nc++; } if(na < a){ nc -= (a - na); } if(nb < b){ nc -= (b - nb); } if(nc < 0)puts("NO"); else puts("YES"); } return 0; }
HS想要统计镇上总共有多少人,但是他并不想一个一个的去数有多少个人,他想了一个其他的方法,他在镇上找了N个人,然后问每一个人“你知道 除你之外 镇上和你姓氏相同的人有多少个吗?”,现在HS想要知道,镇上最少有多少人?我们保证HS不会问同一个人两次。
第一行一个正整数T(T <= 100),表示T组测试样例; 每组样例有两行, 第一行一个正整数N(N <= 50),表示被问到的人数, 第二行N个数(在0 ~ 1000000之间),表示每个人的回答。
每行输出一个正整数,表示镇上最少人数。
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int INF = 0x3f3f3f3f; int a[100]; int main(){ int T, N, kase = 0; scanf("%d", &T); while(T--){ scanf("%d", &N); for(int i = 0; i < N; i++){ scanf("%d", a + i); } sort(a, a + N); int cnt = 1, ans = a[0] + 1; for(int i = 1; i < N; i++){ if(a[i] == a[i - 1]){ cnt++; if(cnt > a[i] + 1){ cnt = 1; ans += a[i] + 1; } } else{ cnt = 1; ans += a[i] + 1; } } printf("Case %d: %d\n", ++kase, ans); } return 0;
有一天,stubird发现了n个糖罐,里面有很多糖罐,很喜欢吃糖的Stubrid当然想吃最多的糖, 但是他只能带走k个罐子,问他最多能带走多少颗糖?
第一行T,表示有T(T<=50)个测试样例 第二行n,k,表示有n个罐子,最多只能带走k个罐子(k<=n<=10^5) 接下来n个数xi,表示第i个罐子里面有多少颗糖(0<=xi<=10^5 )
对于每组样例输出一行,包含一个数,表示最多他能带走多少颗糖
答案保证不会超过10^9
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int num[1000000]; bool cmp(int a,int b) { return a>b; } int main() { int t; scanf("%d",&t); while(t--) { int n,m; memset(num,0,sizeof(num)); int sum=0; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&num[i]); sort(num,num+n,cmp); for(int i=0;i<m;i++) sum+=num[i]; printf("%d\n",sum); } return 0; }
每当节日来临,女友众多的xxx总是能从全国各地的女友那里收到各种礼物。
有礼物收到当然值得高兴,但回礼确是件麻烦的事!
无论多麻烦,总不好意思收礼而不回礼,那也不是xxx的风格。
现在,即爱面子又抠门的xxx想出了一个绝妙的好办法:他准备将各个女友送来的礼物合理分配,再回送不同女友,这样就不用再花钱买礼物了!
假设xxx的n个女友每人送他一个礼物(每个人送的礼物都不相同),现在他需要合理安排,再回送每个女友一份礼物,重点是,回送的礼物不能是这个女友之前送他的那个礼物,不然,xxx可就摊上事了,摊上大事了......
现在,xxx想知道总共有多少种满足条件的回送礼物方案呢?
输入数据第一行是个正整数T,表示总共有T组测试数据(T <= 100); 每组数据包含一个正整数n,表示叽叽哥的女友个数为n( 1 <= n <= 100 )。
请输出可能的方案数,因为方案数可能比较大,请将结果对10^9 + 7 取模后再输出。 每组输出占一行。
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; typedef long long LL; LL f[110]; int main(){ int T, n; f[1] = 0; f[2] = 1; f[3] = 2; f[4] = 9; for(int i = 5; i <= 100; i++){ f[i] = (i - 1) * f[i - 2] % MOD + (i - 1) * f[i - 1] % MOD; f[i] %= MOD; } scanf("%d",&T); while(T--){ scanf("%d", &n); printf("%lld\n", f[n]); } return 0;
}
1869: Mathematics and Geometry
给你一个n,求方程 2x + y + 2z = n 解的个数,其中x, y, z, n 都是非负整数
第一行一个整数T(T<=1000),表示测试数据组数,接着T行,每行一个整数n(n<=1000000)
每组数据输出一行Case #x: ans 其中x表示样例组数,ans表示解的个数
#include<stdio.h> #include<string.h> #include<math.h> #include<map> #include<stack> #include<algorithm> #include<iostream> #define INF 0x3f3f3f3f #define ull unsigned long long #define ll long long #define IN __int64 #define N 1010 #define M 1000000007 using namespace std; const int MAXN = 1000010; int main() { int T=1,t,n,m,i,j,x,y; scanf("%d",&t); while(t--) { scanf("%d",&n); if(n&1) j=1; else j=0; ll sum=0; if(n&1){ ll k = (n - j) / 2 + 1; // printf("k=%lld\n",k); sum = (k * n- k * k )/2; sum += k; printf("Case #%d: %lld\n",T++,sum ); } else{ ll k = (n - j) / 2 + 1; // printf("k=%lld\n",k); sum = (k * n - k*(k-1))/2; sum += k; printf("Case #%d: %lld\n",T++,sum); } } return 0; }
主办方的最少支出
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int n,h[200]; int cost(int x) { int sum=0; for(int i=0;i<n;i++) { if(h[i]>=x) { sum+=(x-h[i])*(x-h[i]); } else { if(x-h[i]>=17) sum+=(x-h[i]-17)*(x-h[i]-17); } } return sum; } int main() { while(scanf("%d",&n)!=EOF) { memset(h,0,sizeof(h)); for(int i=0;i<n;i++) scanf("%d",&h[i]); int minn=0x3f3f3f3f; sort(h,h+n); for(int i=h[n-1];i>=h[0];i--) { minn=min(minn,cost(i)); } printf("%d\n",minn); } return 0; }
题意很简单,给你长度为n的序列,找出有多少个不同的长度为m的严格上升子序列。(PS:相同子序列的定义为,每一个元素对应的下标都相同)
输入数据第一行是个正整数T,表示总共有T组测试数据(T <= 5); 每组数据第一行为n和m,以空格隔开(1 <= n <= 100, 1 <= m <= n); 第二行为n个数,第i个数ai依次代表序列中的每个元素(1 <= ai <= 10^9);
对于每组数据,输出一行Case #x: y,x表示当前测试数据的序号(从1开始),y表示结果。 需要注意的是,结果有可能很大,你需要将结果对1000000007(10^9+7)取余。
#include<stdio.h> #include<string.h> #include<math.h> #include<set> #include<map> #include<queue> #include<stack> #include<algorithm> #include<iostream> #define INF 0x3f3f3f3f #define ull unsigned long long #define ll long long #define IN __int64 #define N 110 #define M 1000000007 using namespace std; int a[N]; ll dp[N][N]; int main() { int T=1,t,n,m; int i,j,k; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%d",&a[i]); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { dp[i][1]=1; for(j=1;j<=i;j++) { for(k=1;k<i;k++) { if(a[k]<a[i]) { dp[i][j]=(dp[i][j]+dp[k][j-1])%M; } } } } ll ans=0; for(i=1;i<=n;i++) ans=(ans+dp[i][m])%M; printf("Case #%d: %lld\n",T++,ans); } }
果果一直很谦虚,但是良辰还是对他出手了(汗。。
良辰拿出来一个 Pascal 三角形(也叫杨辉三角形。(请不要问是怎么拿出来的。。
我们用一个矩阵来表示 Pascal 三角形
0: C(0, 0)
1: C(1, 0) C(1, 1)
2: C(2, 0) C(2, 1) C(2, 2)
...
其中最左边的数字表示行号。C(x, y) 表示一个组合数,即 x 个元素中取 y 个的方法数。
良辰只有一个问题:Pascal 三角形中的第 n 行有多少个奇数?
这样的问题对于果果来说太水了,于是他把这个问题给了你。
第一行为一个整数 T,表示数据组数。 每组数据只有一行,包含一个整数 n,表示 Pascal 三角形的第 n 行。 T <= 2000,0 <= n <= 2^31。
每组数据输出一行,包含一个整数,表示Pascal 三角形的第 n 行中的奇数个数。
#include<stdio.h> #include<string.h> #include<math.h> #include<set> #include<map> #include<queue> #include<stack> #include<algorithm> #include<iostream> #define INF 0x3f3f3f3f #define ull unsigned long long #define ll long long #define IN __int64 #define N 110 #define M 1000000007 using namespace std; int main() { ll n; int t; scanf("%d",&t); while(t--) { scanf("%lld",&n); int cnt=0; while(n) { if(n&1ll) cnt++; n>>=1ll; } printf("%lld\n",1ll<<cnt); } return 0; }