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; }

    • 2
      @ 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);
      	}
      }
      ``````
      `````````
      ````````````
      ```````````````
      ``````````````````
      `````````````````````
      ````````````````````````
      ```````````````````````````
      ``````````````````````````````
      `````````````````````````````````
      
      • 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);
            		}
            	}
            }
            
            • 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
                        标签
                        (无)
                        递交数
                        434
                        已通过
                        229
                        上传者