14 条题解

  • 2
    @ 2024-9-26 6:57:08

    #include<stdio.h>//笨蛋思维? int main(){ int n,a,i; scanf("%d",&n); while(n--){ int m,t=0; scanf("%d",&a); for(i=1;i<=a;i++){ t+=i;//来确定这个数在哪一行 m=i;//m代表第几行 if(t>=a){ break;

    } } if(m%20){//分奇数偶数行 if(ta){ printf("%d/1\n",m); } else{printf("%d/%d\n",a-t+m,t-a+1);}//比较抽象,想了很久。具体看题目给的图,找找规律 } else{ if(ta){ printf("1/%d\n",m);} else{printf("%d/%d\n",t-a+1,a-t+m);}//看清楚ta这种情况,这个比较容易漏。

    } }

    //就结束了?

    return 0; }

    • 1
      @ 2025-11-7 1:13:23
      #include <iostream>
      using namespace std;
      int main() {
      	int t;
      	cin >> t;
      	while (t--) {
      		int N;
      		cin >> N;
      		int k = 0;
      		while ((k * k + k) / 2 < N) {
      			k++;
      		}
      		int a = k * (k - 1) / 2;
      		int b = N - a;
      		if (k % 2 == 0) {
      			cout << b << "/" << (k - b + 1) << '\n';
      		} else {
      			cout << (k - b + 1) << "/" << b << '\n';
      		}
      	}
      	return 0;
      }
      
      • @ 2025-11-7 1:14:02

        注意奇数行跟偶数行的遍历方向

    • 1
      @ 2025-10-31 19:43:53
      #include <stdio.h>
      int main(){
          int m,n,a=0,sum=0,cnt=0,mod,ans1,ans2,ans3,ans4;
          scanf("%d",&m);
          while(m--){
              scanf("%d",&n);
              while(sum<n){
                  a+=1;
                  sum+=a;
                  cnt++;
              }cnt--;
              mod=n-((cnt+1)*cnt)/2;
              if(cnt%2==1){
                  ans3=mod;
                  ans4=(cnt+1)-(mod-1);
                  printf("%d/%d\n",ans3,ans4);
          }
              else{
                  ans1=cnt+1-(mod-1);
                  ans2=mod;
                  printf("%d/%d\n",ans1,ans2);
              }
              cnt=0;sum=0;a=0;
          }
      }
      
      • @ 2025-10-31 19:51:50

        将这些数分成几行,(斜着分成横着的)然后再讨论出n在第几行然后再算出ta在第几列就很容易算出这个数,第几行可以这样算,让sum=1+2+3+4+5.....;直到sum>n,加了几次n就是第几行,然后算余数mod,算sum倒数第二项的值即计数器cnt-1,然后算前cnt-1项和,再用n减去ta就是mod的值.这样就算出数在第几行第几列了

    • 1
      @ 2024-12-10 15:52:36

      #include<stdio.h>

      int main() { int t; scanf("%d", &t); while (t--) { int n; scanf("%d", &n); int sum = 0, ans = 1; int m=n; for (int k = 1; k <= 100000; k++) { if (sum+k < n) { sum += k; ans=k+1; m=m-k; } } if(ans%2==0){ printf("%d/%d\n",m,ans-m+1); } else{ printf("%d/%d\n",ans-m+1,m); } } return 0; }

      • @ 2024-12-10 15:53:00

        思路简单

    • 1
      @ 2024-11-27 17:36:41

      #include<stdio.h> int main() { int m,n; scanf("%d",&m); while(m--) { scanf("%d",&n); int i=n; int j=1; while(i>j) { i=i-j; j++; } if(j%20) { printf("%d/%d\n",i,j-i+1); } if(j%21) { printf("%d/%d\n",j-i+1,i); } } }

      1 11

      3 12 21

      6 31 22 13

      10 14 23 32 41

      15 51 42 33 24 15

      21 16 25 34 43 52 61

      28 71 62 53 4435 26 17

      36 18 27 3645 54 63 72 81

      45 91 82 73 64 55 46 37 28 19

      列举:第一列写的是到本行为止有多少个数(每行都从左开始数)

      可以观察到每行个数+1, 所以输入的数只需要递减遍历,当i=i-j < j,即该数在第j行; 再观察奇偶的区别输出即可。

      • 1
        @ 2024-11-1 15:23:39

        #include <stdio.h>

        int main()

        {

        int m;

        scanf("%d",&m);

        while(m--){

        int N;

        scanf("%d",&N);

        int ha=1,le=1;

        int n=1;

        int m=0;

        while(1){

        m+=n;

        if(n%2==1){

        int q=m;

        for(int i=1;i<=n;i++){

        le=n-i+1;

        ha=i;

        if(q==N){

        m=q;

        break;

        }

        q--;

        }

        }else{

        int q=m;

        for(int i=1;i<=n;i++){

        ha=n-i+1;

        le=i;

        if(q==N){

        m=q;

        break;

        }

        q--;

        }

        }

        n++;

        if(m==N){

        break;

        }

        }

        printf("%d/%d\n",ha,le);

        }

        return 0;

        }

        • 1
          @ 2023-11-30 21:20:48
          int m, n,bz,i,j,w;
          int main(void) {
          	scanf("%d", &m);
          	while (m--) {
          		bz = 1;
          		w = 0;
          		scanf("%d",&n);
          		for ( i = 1; n>0 ;i++){
          			n = n - i;
          			bz++;
          		}
          		bz--;
          		if (n < 0) {
          			w = n + i - 1;
          		}
          		else if (n == 0) {
          			w = i-1;
          		}
          		//printf("%d %d", bz, w);
          		if (bz % 2 == 0) {
          			printf("%d/%d\n", w, (bz + 1 - w));
          		}
          		else {
          			printf("%d/%d\n", (bz + 1 - w), w);
          		}
          	}
          }
          
          • 1
            @ 2023-10-4 11:09:22
            将这些数分成几行(斜着 如1行只有 1 1 2行有 1 2
            
            和 2 1)然后计算出在第几行,最后分成奇偶情况
            
            讨论,很容易就能找出规律
            ```#include<stdio.h>
            int main()
            {
            	int m;
            	scanf("%d",&m);
            	while(m--)
            	{
            		int n;
            		scanf("%d",&n);
            		int sum=0;
            		int d1=1;
            		int i;
            		while(sum<n)
            		{
            			for(i=1;i<=d1;i++)
            			{
            				sum++;
            				if(sum==n)
            				break;
            			}
            			if(sum<n)
            			{
            				d1++;
            			}
            		}
            		if(d1%2==0)
            		printf("%d/%d\n",i,d1-i+1);
            		else
            		printf("%d/%d\n",d1-i+1,i);
            	}
            }
            ``````
            `````````
            ````````````
            ```````````````
            ``````````````````
            `````````````````````
            ````````````````````````
            ```````````````````````````
            ``````````````````````````````
            `````````````````````````````````
            
            • 0
              @ 2025-10-31 17:18:51

              #include<stdio.h> int main() { int t; scanf("%d", &t); while (t--) { int x; scanf("%d", &x); int sum = 0; int i = 0; while (sum < x) { i++; sum += i; } int cnt = x; for ( int j =1;j<i;j++) { cnt-=j; } if (i%2==0) { printf("%d/%d\n",cnt,i-cnt+1); } else { printf("%d/%d\n",i-cnt+1,cnt); } } return 0;

              • 0
                @ 2025-8-20 17:32:37

                来个单次评测O(1)的极简解法😋

                这些像杨辉三角的都可以解方程😀

                1. 运用求根公式解二次方程
                2. 经过适当的floor, ceil得到层数
                3. 可以发现题目中给的是”S形走位“,可以联想到奇数行或偶数行翻转(倒序输出)
                4. 每行的和固定,求出cnt(行中第几个)即可表示
                from math import sqrt,ceil,gcd,log;re=lambda:map(int,input().split())
                t, = re()
                for _ in range(t):
                    n, = re()
                    a = ceil((sqrt(1 + 8 * n) - 1) / 2) - 1
                    cnt = n - a * (a + 1) // 2
                    b = a + 2 - cnt
                    print(f"{cnt}/{b}" if a & 1 else f"{b}/{cnt}")
                
                • 0
                  @ 2024-9-24 11:53:06

                  #include <stdio.h>

                  int main() {
                      int m, N, n, num, den, k;
                      scanf("%d", &m); // 读取测试数据组数
                  
                      for (int i = 0; i < m; i++) {
                          scanf("%d", &N); // 读取每组的N值
                  
                          // 计算分数的位置
                          n = 1; // 行数
                          k = 0; // 当前编号的索引
                  
                          while (1) {
                              // 当前对角线的元素数量
                              k += n;
                  
                              if (k >= N) {
                                  // 找到对应的行和列
                                  int position = N - (k - n); // 位置在当前对角线
                                  if (n % 2 == 0) {
                                      // 偶数行,分母递增,分子递减
                                      num = position;
                                      den = n + 1 - position;
                                  } else {
                                      // 奇数行,分子递增,分母递减
                                      num = n + 1 - position;
                                      den = position;
                                  }
                                  break;
                              }
                              n++; // 移动到下一行
                          }
                          
                          // 输出结果
                          printf("%d/%d\n", num, den);
                      }
                  }
                  
                  • 0
                    @ 2023-12-13 18:21:57

                    #include <stdio.h> int main() { int m; scanf("%d",&m); while(m--) { int n,t,a,b; scanf("%d",&n); int i=1; while(i*(i+1)<2n) { i++;//如果该项大于所编码的数量 } //此时的i表示该项所在的位数 i--;//为了求t i--后的 (ii+1)/2表示该项次数前面编码的数量 t=n-(i*(i+1)/2);//t表示第n项在第i次中站的位置的位数 if((i+1)%2==0) { a=t; b=(i+1)-(t-1); } else { a=(i+1)-(t-1); b=t; } printf("%d/%d\n",a,b);

                    } return 0;

                    }

                    • 0
                      @ 2023-10-19 20:51:21

                      还是有点意思的找规律问题

                      #include<iostream>
                      using namespace std;
                      int main()
                      {
                          int m;
                          cin >> m;
                          while(m--)
                          {
                              int m;
                              cin >> m;
                              int sum = 0,num = 0,k = 0;
                              for(int i = 1 ; i < 1000 ; i++)
                              {
                                  sum += i;
                                  num += i-1;
                                  if(m >= num&&m <= sum)
                                  {
                                      k = i;
                                      break;
                                  }
                              }
                              int cnt = m - num;
                              int fm,fz;
                              if(k % 2 == 1)
                              {
                                  for(int i = k , j = 1 ; ; i-- , j++)
                                  {
                                      if(j == cnt)
                                      {
                                          fz = i;
                                          fm = j;
                                          break;
                                      }   
                                  }
                              }
                              else if(k % 2 == 0)
                              {
                                  for(int i = 1 ,j = k ; ; i++ , j--)
                                  {
                                      if(i == cnt)
                                      {
                                          fz = i;
                                          fm = j;
                                          break;
                                      }
                                  }
                              }
                              cout << fz << "/" << fm << endl;
                          }
                          return 0;
                      }
                      
                      
                      • 0
                        @ 2023-9-26 21:18:25

                        题目难度为2的题?

                        #include<stdio.h>
                        int number1[1000];
                        int main()
                        {
                            int n,m,j,k,t;
                            int i=1,sum=0;
                            while(1)
                            {
                                sum=sum+i;
                                number1[i]=sum;
                                i++;
                                if(sum>100000)
                                    break;
                            }
                            scanf("%d",&m);
                            while(m--)
                            {
                                scanf("%d",&n);
                                for(j=1;j<i;j++)
                                {
                                    if(n<=number1[j])
                                    {
                                        t=j;
                                        break;
                                    }
                                }
                                if(t%2!=0)
                                {
                                    if((number1[j]-n)==(n-number1[j-1]-1))
                                        printf("%d/%d\n",(t+1)/2,(t+1)/2);
                                    if((number1[j]-n)<(n-number1[j-1]-1))
                                    {
                                        int z=t-(number1[j]-n);
                                        int y=number1[j]-n+1;
                                        printf("%d/%d\n",y,z);
                                    }
                                    if((number1[j]-n)>(n-number1[j-1]-1))
                                    {
                                        int z=t-(number1[j]-n);
                                        int y=number1[j]-n+1;
                                        printf("%d/%d\n",y,z);
                                    }
                                }
                                if(t%2==0)
                                {
                                    if((number1[j]-n)<(n-number1[j-1]-1))
                                    {
                                        int z=t-(number1[j]-n);
                                        int y=number1[j]-n+1;
                                        printf("%d/%d\n",z,y);
                                    }
                                    if((number1[j]-n)>(n-number1[j-1]-1))
                                    {
                                        int z=t-(number1[j]-n);
                                        int y=number1[j]-n+1;
                                        printf("%d/%d\n",z,y);
                                    }
                                }
                            }
                            return 0;
                        }
                        
                        • 1

                        信息

                        ID
                        155
                        时间
                        3000ms
                        内存
                        128MiB
                        难度
                        3
                        标签
                        (无)
                        递交数
                        417
                        已通过
                        216
                        上传者