A.
#include <stdio.h> #define max(a,b) ((a) > (b) ? (a) : (b)) inline int F() { register int aa , bb , ch; while(ch = getchar() , (ch<'0'||ch>'9') && ch != '-'); ch == '-' ? aa=bb=0 : (aa=ch-'0',bb=1); while(ch = getchar() , ch>='0'&&ch<='9') aa = aa*10 + ch-'0'; return bb ? aa : -aa; } const int Maxn = 100010; int a[Maxn] , mx = 0 , ans = 0; int main() { int n = F(); for(int i=1; i<=n; ++i) a[i] = F() , mx = max(mx , a[i]); for(int i=1; i<=n; ++i) ans += mx - a[i]; printf("%d\n",ans ); }
B.
#include <stdio.h> #include <string.h> const int Maxn = 100005; int n , a , b , c , d , lz[5] , ans[5]; char s[Maxn]; int main() { scanf("%s",s+1); n = strlen(s+1); for(int i=1; i<=n; ++i) { if(s[i] == 'R') lz[i%4] = 0; if(s[i] == 'B') lz[i%4] = 1; if(s[i] == 'Y') lz[i%4] = 2; if(s[i] == 'G') lz[i%4] = 3; } for(int i=1; i<=n; ++i) if(s[i] == '!') ++ans[lz[i%4]]; printf("%d %d %d %d\n",ans[0],ans[1],ans[2],ans[3]); }
C.
找个循环节然后纯模拟,题目看错。。以为蛇形的,代码细节,不放上来了。
D.
首先位数越少显然越小,然后低位越大显然越小,然后记录一下连续0的个数,不能和前面连上的0单独一位,跑一下即可。代码又臭又长不放了。
E.
先建出最小权值的合法树,然后加,考虑优先+上限再dfs子树即可(这里sb了写了好几遍然后手滑不小心删了就懒得再写了)
F.
我们考虑等比数列公比是p/q,则第一项肯定是q的n-1次方的倍数这样才都是整数。我们考虑枚举公比,ii是q^(n-1),jj是p^(n-1),然后r*ii/jj就是最大的首项,(r*ii/jj)/ii - (l-1)/ii就是我可以选几个公比是p/q这样的,然后统计即可。然后直接暴力枚举公差会炸我们考虑最大范围q^(n-1)<=1e7所以是pow(2,log2(1e7)/(n-1)+1),但是n=1,n=2时候会t而且很好特判所以很轻松的特判就可以了。
#include <stdio.h> #include <math.h> #define ll long long ll gcd(ll a , ll b) { return b ? gcd(b,a%b) : a; } ll p(ll a , ll b) { ll ans = 1; for(; b; b>>=1 , a*=a) if(b&1) ans *= a; return ans; } ll l , r , n , ans; int main() { scanf("%lld%lld%lld",&n,&l,&r); if(n > 24) { puts("0"); return 0; } if(n == 1) { printf("%lld\n",r-l+1); return 0; } if(n == 2) { printf("%lld\n",(r-l+1)*(r-l)); return 0; } int lim = pow(2,log2(1e7)/(n-1)+1); for(int i=1; i<=lim; ++i) for(int j=i+1; j<=lim; ++j) if(gcd(i,j) == 1) { long long ii = p(i,n-1) , jj = p(j,n-1); if(l*jj/ii > r) continue; ans += (r*ii/jj)/ii - (l-1)/ii; } printf("%lld\n",ans*2 ); }