4 条题解

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

    好神奇好有趣好诡的规律

    信息

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