#include<iostream> #include<cstring> #include<algorithm> #include<cmath> usingnamespace std; int n; intget(int l,int r,int a[]){ int res = 0 ; for(int i = l;i<=r;i++) res+=res*10+a[i]; return res; } intmain(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n; int cnt = 0; int x[9]={1,2,3,4,5,6,7,8,9}; do{ for(int i = 0;i<=6;i++){ for(int j = i+1;j<=7;j++){ int a = get(0,i,x); int b = get(i+1,j,x); int c = get(j+1,8,x); if(a*c+b==c*n)cnt++; }
for(int i =0;i*i<=n;i++) for(int j =i;j*j+i*i<=n;j++) sum[cnt++] = {i*i+j*j,i,j}; sort(sum,sum+cnt); for(int a = 0;a*a<=n;a++) for(int b = a;a*a+b*b<=n;b++){ int t = n-a*a-b*b; int l = 0 , r = cnt-1; while(l<r){ int mid = l+r>>1; if(sum[mid].s>=t) r = mid; else l = mid+1; } if(sum[l].s==t){ cout<<a<<' '<<b<<' '<<sum[l].c<<' '<<sum[l].d; return0;
int n; int a[N], b[N], c[N]; int as[N]; // as[i]表示在A[]中有多少个数小于b[i] int cs[N]; // cs[i]表示在C[]中有多少个数大于b[i] int cnt[N], s[N];
intmain() { scanf("%d", &n); for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]), a[i] ++ ; for (int i = 0; i < n; i ++ ) scanf("%d", &b[i]), b[i] ++ ; for (int i = 0; i < n; i ++ ) scanf("%d", &c[i]), c[i] ++ ; //预处理出每个b[i]与a[i]和c[i]相关的前缀和 // 求as[] for (int i = 0; i < n; i ++ ) cnt[a[i]] ++ ;//cnt记录的是某个数字出现的次数,将a数组中的所有数字出现的次数录入,其中i是从小到大的,所以里面的数已经排好序,可以按序取次数 for (int i = 1; i < N; i ++ ) s[i] = s[i - 1] + cnt[i]; // 求cnt[]的前缀和,s[i]记录的即0-i中小于等于i的数的个数 for (int i = 0; i < n; i ++ ) as[i] = s[b[i] - 1];//as[i]记录小于b[i]的数字出现的次数。
// 求cs[],重复as过程 memset(cnt, 0, sizeof cnt); memset(s, 0, sizeof s); for (int i = 0; i < n; i ++ ) cnt[c[i]] ++ ;//记录出现次数 for (int i = 1; i < N; i ++ ) s[i] = s[i - 1] + cnt[i];//求次数前缀和 for (int i = 0; i < n; i ++ ) cs[i] = s[N - 1] - s[b[i]];//因为是找大于b[i],从n+1到最大值的出现次数。
// 枚举每个b[i] LL res = 0; for (int i = 0; i < n; i ++ ) res += (LL)as[i] * cs[i];
int n, m, k; int w[N][N];//记录价值的数组 int f[N][N][13][14];//dp数组,f[i][j][cnt][value]ij记录的是当前走到的点的坐标,cnt记录的是已经取了k件物品,value记录的是取到的最后一件物品的价值,由于只有宝箱的价值大于手上的物品的价值才能取得,因此当取走宝箱里面的物品之后,其手中的物品的最大价值就是宝箱的价值。整个dp数组最终存储的就是(i,j)点,手中物品数量为cnt,手中物品最大价值为value的方案数量
intmain() { cin >> n >> m >> k; for (int i = 1; i <= n; i ++ ) for (int j = 1; j <= m; j ++ ) { cin >> w[i][j];//存入价值 w[i][j] ++ ;//因为价值的范围为0-12,如果不增加1,容易产生0和0之间没法取大的情况,因此要先加1 } //初始化dp数组 f[1][1][1][w[1][1]] = 1;//(1,1)如果取得,则(1,1)手中1个物品,最大物品价值为w[1][1]的方案数为1 f[1][1][0][0] = 1;//(1,1)不取的方案数为1
for (int i = 1; i <= n; i ++ ) for (int j = 1; j <= m; j ++ ) {//遍历迷宫 if (i == 1 && j == 1) continue;//起点 for (int u = 0; u <= k; u ++ ) for (int v = 0; v <= 13; v ++ ) {//遍历uv情况 int &val = f[i][j][u][v]; //取出方案数量 val = (val + f[i - 1][j][u][v]) % MOD; //从上面来的,不取 val = (val + f[i][j - 1][u][v]) % MOD;//从左边来的,不取 if (u > 0 && v == w[i][j]) //u>0说明取了,v就是目前的价值 { for (int c = 0; c < v; c ++ )//枚举上一个格子的c { val = (val + f[i - 1][j][u - 1][c]) % MOD; val = (val + f[i][j - 1][u - 1][c]) % MOD; } } } }
int res = 0; for (int i = 0; i <= 13; i ++ ) res = (res + f[n][m][k][i]) % MOD;
intmain(){ string line; int cnt; cin>>cnt; getline(cin,line); while(cnt--){ int t =(get_time()+get_time())/2; int hour = t/3600; int minute = t%3600/60; int second = t%60; printf("%02d:%02d:%02d\n",hour,minute,second);
int n; int tr[N], level[N];//level数组记录的是某等级的星星的数量,tr记录的是星星图
intlowbit(int x) { return x & -x; }
voidadd(int x)//加入一颗行星 { for (int i = x; i < N; i += lowbit(i)) tr[i] ++ ;//加入后后面的星星前面的星星数量加一,即星等加一 }
intsum(int x)//记录前面有多少个星星 { int res = 0; for (int i = x; i; i -= lowbit(i)) res += tr[i]; return res; }
intmain() { scanf("%d", &n); for (int i = 0; i < n; i ++ ) { int x, y; scanf("%d%d", &x, &y); x ++ ;//因为y增序,所以只需要考虑x level[sum(x)] ++ ;//sum(x)即星等,由于求星等不包括x在内,所以先查星等,再把x加进去 add(x); }
for (int i = 0; i < n; i ++ ) printf("%d\n", level[i]);