解方程
小象同学在初等教育时期遇到了一个复杂的数学题,题目是这样的:
给定自然数 nn,确定关于 x, y, zx,y,z 的不定方程 \displaystyle \sqrt{x - \sqrt{n}} + \sqrt{y} - \sqrt{z} =0x−n
当时的小象同学并不会做这道题。多年后,经过高等教育的洗礼,小象同学发现这道题其实很简单。小象同学认为你一定也会做这道题,所以把这道题留给了你。为了便于输出,你不需要输出每一组解 (x, y, z)(x,y,z),你只需要给出解的数量和所有解的 x y zxyz 之和对 (10^9+7)(109+7) 取模的值即可。注意,解的数量不对 (10^9+7)(109+7) 取模。
输入描述
输入包含多组测试数据。输入的第一行包含一个正整数 TT (1 \leq T \leq10^41≤T≤104),表示测试数据的组数。接下来依次描述每组测试数据,对于每组测试数据:
仅一行,包含一个非负整数 nn (0 \leq n \leq 2 \times 10^90≤n≤2×109),含义如题面所示。
输出描述
对于每组数据,输出一行。若方程有无穷多组自然数解,则在这一行输出 \text{``infty''}“infty”(不含引号),否则在这一行输出两个整数,其中第一个整数表示方程的解数,第二个整数表示所有解的 x y zxyz 之和对 (10^9+7)(109+7) 取模的值,这两个整数之间用恰好一个空格隔开,行末不要有多余的空格。
样例输入 1
361224
样例输出 1
0 01 122 72
提示
当 n = 12n=12 时,方程唯一的解为 x = 4x=4, y = 1y=1, z = 3z=3。
当 n = 24n=24 时,方程的两组解为 x = 5x=5, y = 2y=2, z = 3z=3 和 x = 7x=7, y = 1y=1, z = 6z=6。
可以通过化简(移项,平方)得到 x=z+y,n=4zy
无解就是不为整数
但是什么时候存在无穷解呢,x=sqrt(n),y,z就可以无限取了,其实就是完全平方数
注意下sqrt向下取整的细节,然后把自己代码常数写的小一点就可以了
关于强制转换,只要有一个是位数更多的,得到的就是位数更多的,然后注意不要溢出就好了
#includeusing namespace std;const int MD=1e9+7;int main(){ int T,n; scanf("%d",&T); while(T--) { scanf("%d",&n); int x=sqrt(n+0.5); if(x*x==n)printf("infty\n"); else if(n%4) printf("0 0\n"); else { n/=4; int y=sqrt(n+0.5); int num=0,ans=0; for(int i=1;i<=y;i++) if(n%i==0) ans=(ans+1LL*n*(i+n/i))%MD,num++; printf("%d %d\n",num,ans); } } return 0;}
积性函数解法,51nod1220请,这个还不会