2971. 3的倍数

SmallY

数学题
考虑样例中的2 8,那么相当于考虑18,28,38,…,98中有几个能被3整除。
我们知道当数字上所有位数加起来能被3整除时,这个数能被3整除,而我们可以将1-9分成三组:369,147,258,分别是模3余0,1,2三种情况那么不管个位是几,总能找到合适的一组去匹配它,所以个数就是3.
容易知道这个结论是可以推广到n位的.
那么我们只需要计算99…9-10…0中能被3整除的有几个数,即(99…9-10…0+1)/3

#include <bits/stdc++.h>

using namespace std;

int main() {
    int T;
    cin >> T;
    for(int a = 0; a < T; ++a){
        int c, w;
        cin >> c >> w;
        int start = (int)pow(10, c-2);
        int end = 0;
        for(int i = 0; i < c-1; ++i){
            end = end*10+9;
        }
        int count = end-start+1;
        printf("case #%d:\n%d\n", a, count/3);
    }
    return 0;
}
SmallY

markdown的支持好差啊

Li Dao

用到一个性质,稍微方便一点

include

using namespace std;
int T,c,w;
int create(int aa)
{
int ret=1;
for(int i=1;i<=aa-1;i++) ret*=10;
return ret;
}
int sumofnum(int aa)
{
int ret=0;
if(aa==0) return 0;
while(aa)
{
ret+=aa%10;
aa/=10;
}
return ret;
}
int main()
{
cin>>T;
for(int step=0;step>c>>w;
for(int i=create(c-1);i<=create(c)-1;i++)
if((sumofnum(i)+w)%3==0) ans++;
printf(“case #%d:\n%d\n”,step,ans);
}
return 0;
}

数字能被3整除 等价于 各个位置上的数字加起来能被3整除

(貌似完全没有方便到哪里去,甚至还多写了个sumofnum函数)

还不如老老实实这样

include

using namespace std;
int T,c,w;
int create(int aa)
{
int ret=1;
for(int i=1;i<=aa-1;i++) ret=10;
return ret;
}
int main()
{
cin>>T;
for(int step=0;step>c>>w;
for(int i=create(c-1);i<=create(c)-1;i++)
if((i
10+w)%3==0) ans++;
printf(“case #%d:\n%d\n”,step,ans);
}
return 0;
}

13627999316
学会怎么发题解再来发题解吧,每次都能看到你,每次你的题解都格式错误
CatFlowers

老版oj贴不出来源码的。理解一下

13627999316

恩,原来是这样,理解万岁

你当前正在回复 博客/题目
存在问题!