关于3,7,9的整除 (简单数论)

Digits

阿尔特姆在黑板上连续写了 d 这个数字整整 n! 次. 因此, 他得到了数字 dddddd…ddd (正好是 n! 位).

现在, 他很想知道从 1 到 9 有哪些奇数能整除他所写的数字.

输入

第一行包含一个整数 t ( 1≤t≤100 ) - 测试用例数. 接下来是 t个测试用例.

每个测试用例由一行组成,包含两个整数 n和 d ( 2≤n≤1e9 , 1≤d≤9 )

输出

对于每个测试案例,按升序输出除以黑板上所写数字的奇数.

分析

首先1~9的奇数包含1 3 5 7 9,

1肯定可以整除他所写的数, 答案必定包含1

若想被5 整除, 最后一位必须是5或0, 根据题意 n! 个d组成的数不肯能为0000...00, 故只有d==5 才能输出5

接下来讨论 3 和 9 ,

一个数若想被 3 整除, 各位数字之和必须被 3 整除.

也就是说, 需要判断 n! 个d 的和, 假定和为sum= n!*d

当n>=3时 n! = 1 * 2 * 3 *... * n, 必定满足被3整除, 当n<3时,若d==3或6或9, 则也满足, 否则不能输出3

一个数若想被 9 整除, 各位数字之和必须被 9 整除.

当 n>=6 时 n! = 1 * 2 * 3 *... * 6 *... ,其中6可以分解成3 *2, 那么这里就有两个3相乘, 一定满足被9整除

当 3<=n<6 时, d==3或6或9 才能满足被整除条件

否则 d必须为9才能满足

关于一个数能否被7整除

做这题的时候这是我的知识盲区

假设一个数为 abcdefgh ,它被7整除的充要条件是 (abcde-fgh) % 7==0

也就是 最后三位数构成的百位数 还有 除了这三位数的其他位数构成的数之差 被 7 整除

(证明略, 需要用到1001%7==0这个性质)

对于本题 如果d==7 则一定可以, 否则判断 dddddd…ddd 能否被7所整除, 需要用上面这个结论,

假设所写的数为 ddddd ddd (8个d) , 进行一次 上面的计算后得到 dd000

接下来判断 (dd-000)%7==0 ?

可以推断假如d足够长, 每次都会少3个d,

又因为d, dd, ddd, (d不为7) 不可能被7整除, 所以剩下1个2个或者3个d都不行,

只有剩下0个d,也就是刚好写了3 的(大于1)倍数个d的时候最后才有(ddd - ddd)%7==0

由题目d的个数n! = 1 * 2 * 3 *... * n, 当n>=3时, 满足上面一行的条件(因为个数里面有2 * 3 * n ) ,

综上 d==7 或者n>=3 的时候才能被7整除

ac代码

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define int long long

const int N=2e5+5;


void solve(){
    int n,d;cin>>n>>d;

    cout<<1<< ' ';

    if(d==3||d==6||d==9||n>=3)cout<<3<<' ';
    if(d==5)cout<<5<<' ';
    if(d==7||n>=3)cout<<7<<' ';
    if(d==9||n>=6||(n>=3&&d==3)||(n>=3&&d==6)||(n>=3&&d==3))cout<<9;

    cout<<endl;

}

signed main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _;cin>>_;while(_--)
    solve();
    return 0;
}

题目来自Educational Codeforces Round 173 (Rated for Div. 2) B. Digits

posted @ 2025-03-03 21:28  byxxx  阅读(43)  评论(0)    收藏  举报