题目描述
H君有一天出门的时候也许是因为过于疲惫,不幸追尾了一辆黑色高级轿车,车主提出的和解条件是......解答一个数论难题!H君一秒钟就搞到了答案,但是想要保护后辈的您决定帮H君回答这个问题:
车主定义了一个函数 f(x)f(x) 表示正整数 xx 的各数位之和,举例来说,f(114514) = 1+1+4+5+1+4=16f(114514)=1+1+4+5+1+4=16。
现在将有 qq 次询问,每次询问给出一个数 nn ,您需要回答 nn 的约数中有多少个数 xx 满足 f(x)=\left\lfloor \frac{x}{2}\right\rfloorf(x)=⌊2x⌋ 。
输入描述
第一行一个数 qq ,表示询问次数。
接下来 qq 行,每行一个数 nn。
数据范围:
1\leq n \leq10^{18}, 1 \leq q \leq 10^51≤n≤1018,1≤q≤105 。
输出描述
共 qq 行,每一行为给出的 nn 的约数中满足条件的数的个数。
样例输入 1
11 1 2 3 4 5 6 7 8 9 10 1145141919810
样例输出 1
0 0 0 0 0 0 0 0 0 0 1
提示
样例解释 1:
找规律即可,因为100以内只有17和18满足,大于100的所有数都不满足,所转移只要判断是否为17和18的倍数就行了。
AC代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
using namespace std;
ll n,m,t;
int i,j,k,l;
int ans,sum,num,cnt;
char a[200010];
int b[10];
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
cnt=0;
if(n%17==0)
cnt++;
if(n%18==0)
cnt++;
printf("%d\n",cnt);
}
return 0;
}