4 条题解

  • 2
    @ 2025-6-4 16:39:47

    直接打表找规律!

    除前两项外,若为奇数项,则 ansi=2n2ans_i=2^n-2 否则 ansi=2n+2ans_i=2^n+2

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #define int long long
    #define N 55
    using namespace std;
    bool Test_MLE_start;
    int T=1,n;
    int ans[N];
    inline int reads(){
    	char c=getchar();
    	int sum=0,f=1;
    	while(!isdigit(c)){
    		if(c=='-') f=-1;
    		c=getchar();
    	}
    	while(isdigit(c)){
    		sum=(sum<<3)+(sum<<1)+(c^'0');
    		c=getchar();
    	}
    	return sum*f;
    }
    inline void files(){
    	freopen("std.in","r",stdin);
    	freopen("std.out","w",stdout);
    }
    inline void clr(){
    //	Don't forget!
    
    }
    bool Test_MLE_end;
    signed main(){
    //	printf("%lf Mb\n",(&Test_MLE_end-&Test_MLE_start-1)/1024.0/1024.0);
    //	files();
    //	T=reads();
    	int now=4;
    	ans[1]=3,ans[2]=6;
    	for(int i=3;i<=50;i++){
    		ans[i]=now*2;
    		now*=2;
    		if(i&1) ans[i]-=2;
    		else ans[i]+=2;
    	}
    	while(scanf("%lld",&n)!=EOF){
    		clr();
    		printf("%lld\n",ans[n]);
    	}
    	return 0;
    }
    
    
    • 0
      @ 2026-6-22 10:47:58

      60pts

      #include <bits/stdc++.h>
      using namespace std;
      #define int long long
      #define ull unsigned long long
      const int N=1e7+5;
      ull f[N];
      
      signed main()
      {
      	int m=3;
      	
      	f[1]=1ull*m;
      	f[2]=1ull*m*(m-1);
      	f[3]=1ull*m*(m-1)*(m-2);
      	
      	for(int i=4;i<N;i++)
      	{
      		f[i]=1ull*(m-1)*f[i-2]+1ull*(m-2)*f[i-1];		
      	} 
      	
      	int n;
      	while(cin>>n)
      	{
      		cout<<f[n]<<'\n';
      	}
      	return 0;
      }
      
      • 0
        @ 2025-6-4 17:27:05

        方格填数(诡异版)

        分享一个有趣的规律~

        写一个无脑dfs,跑前30个应该都是没有问题的,然后把这30个数打表:

        int a[N]={0,3,6,6,18,30,66,126,258,510,1026,2046,4098,8190,16386,32766,65538,131070,262146,524286,1048578,2097150,4194306,8388606,16777218,33554430,67108866,134217726,268435458,536870910,1073741826,};
        

        看后面的大数,更容易注意到,现在这个数差不多是前一个数的两倍噢!然后发现有细微的不同...这个时候不要慌,发现这个细微的不同基本上都出现在个位上,所以期望通过一些加减运算等得出规律。

        从N=3开始(N=1,2都无法构成一个真正意义上的“圈”,赋特值即可),观察前面的小数:

        N=3: ans = (6-3)* 2 = 6
        N=4: ans = (6+3)* 2 = 18
        N=5: ans = (18-3)* 2 = 30
        N=6: ans = (30+3)* 2 = 66
        ......
        

        好了,规律很显然了...

        #include<bits/stdc++.h>
        #define int unsigned long long
        using namespace std;
        const int N=51;
        int n,dp[N];
        void init(int n){
        	dp[0]=0,dp[1]=3,dp[2]=6;//!!!
        	for(int i = 3;i<=n;i++){
        		if(i%2)dp[i]=(dp[i-1]-3)*2;
        		else dp[i]=(dp[i-1]+3)*2;
        	}
        }
        signed main(){
        	ios::sync_with_stdio(0);
        	cin.tie(0);cout.tie(0);
        	init(N);
        	while(cin>>n){cout<<dp[n]<<'\n';}
        	return 0;
        }
        

        好神奇好有趣好诡的规律

        • -2
          @ 2025-6-4 17:40:47

          大表中规律

          • 1

          信息

          ID
          248
          时间
          1000ms
          内存
          256MiB
          难度
          6
          标签
          (无)
          递交数
          17
          已通过
          10
          上传者