关于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

浙公网安备 33010602011771号