本题用时:10min
个人认为难度:红题
考点:进制转换
一、个人做出这题的经历
第1~3分钟:看完了题目,没看懂样例
第4~5分钟:发现自己瞎了,漏看了“注意x是以十进制输入的。”这句话。
第6~10分钟:AC这道题
二、这道题的思路:
1.把x变成三进制
我们要把x拆分成三进制的数,方法:把x一直mod 3,直到x = 0.每次把结果放进数组里,x除以3(向下取整),最后把数组倒序输出。
例如:12(10进制) = 110(3进制)
a数组下标从1开始:
①x = 12,a[] = {}
②x = 4,a[] = {0}
③x = 1,a[] = {0,1}
④x = 0,a[] = {0,1,1}
a数组倒序为110.
2.统计方案数
一开始ans = 1,表示至少有1种方案
以下用到了乘法原理。
如果a[i]为0,说明第i位与第-i位都为白色,方案数*1(不变)。
如果a[i]为1,说明第i位与第-i位一白一紫,方案数*2(有两种情况)。
如果a[i]为2,说明第i位与第-i位都为紫色,方案数*1(不变)。
3.处理坑点
本题有3个坑
①ans需要开long long(数据较水,不需要高精度)
②如果一开始输入的x%3等于2,则情况数一定为0(第0格不可能出现2)
③第0格即使是1,也只有1种情况(一开始直接除以3即可)
4.AC代码
#include<bits/stdc++.h>
using namespace std;
int t,x;
long long n,ans;
int main()
{
cin >> t;
while(t--)
{
ans = 1;
cin>>n;
if(n % 3 == 2)
{
cout << 0 << endl;
continue;
}
n/=3;
while(n){
x=n%3;
if(x == 1) ans*=2;
n/=3;
}
cout << ans << endl;
}
return 0;
}
本题解原稿:P9154 「GLR-R4」立夏题解 - lzr121107 的博客 - 洛谷博客 (luogu.com.cn)
这是我的洛谷号:lzr121107,尽情关注!